diff --git a/cts/cts-scheduler.in b/cts/cts-scheduler.in index dee56d3e26..e2b54cb119 100644 --- a/cts/cts-scheduler.in +++ b/cts/cts-scheduler.in @@ -1,1611 +1,1612 @@ #!@PYTHON@ """ Regression tests for Pacemaker's scheduler """ __copyright__ = "Copyright 2004-2022 the Pacemaker project contributors" __license__ = "GNU General Public License version 2 or later (GPLv2+) WITHOUT ANY WARRANTY" import io import os import re import sys import stat import shlex import shutil import argparse import subprocess import platform import tempfile DESC = """Regression tests for Pacemaker's scheduler""" # Each entry in TESTS is a group of tests, where each test consists of a # test base name, test description, and additional test arguments. # Test groups will be separated by newlines in output. TESTS = [ [ [ "simple1", "Offline" ], [ "simple2", "Start" ], [ "simple3", "Start 2" ], [ "simple4", "Start Failed" ], [ "simple6", "Stop Start" ], [ "simple7", "Shutdown" ], #[ "simple8", "Stonith" ], #[ "simple9", "Lower version" ], #[ "simple10", "Higher version" ], [ "simple11", "Priority (ne)" ], [ "simple12", "Priority (eq)" ], [ "simple8", "Stickiness" ], ], [ [ "group1", "Group" ], [ "group2", "Group + Native" ], [ "group3", "Group + Group" ], [ "group4", "Group + Native (nothing)" ], [ "group5", "Group + Native (move)" ], [ "group6", "Group + Group (move)" ], [ "group7", "Group colocation" ], [ "group13", "Group colocation (cant run)" ], [ "group8", "Group anti-colocation" ], [ "group9", "Group recovery" ], [ "group10", "Group partial recovery" ], [ "group11", "Group target_role" ], [ "group14", "Group stop (graph terminated)" ], [ "group15", "Negative group colocation" ], [ "bug-1573", "Partial stop of a group with two children" ], [ "bug-1718", "Mandatory group ordering - Stop group_FUN" ], [ "bug-lf-2613", "Move group on failure" ], [ "bug-lf-2619", "Move group on clone failure" ], [ "group-fail", "Ensure stop order is preserved for partially active groups" ], [ "group-unmanaged", "No need to restart r115 because r114 is unmanaged" ], [ "group-unmanaged-stopped", "Make sure r115 is stopped when r114 fails" ], [ "group-dependents", "Account for the location preferences of things colocated with a group" ], [ "group-stop-ordering", "Ensure blocked group member stop does not force other member stops" ], [ "colocate-unmanaged-group", "Respect mandatory colocations even if earlier group member is unmanaged" ], ], [ [ "rsc_dep1", "Must not" ], [ "rsc_dep3", "Must" ], [ "rsc_dep5", "Must not 3" ], [ "rsc_dep7", "Must 3" ], [ "rsc_dep10", "Must (but cant)" ], [ "rsc_dep2", "Must (running)" ], [ "rsc_dep8", "Must (running : alt)" ], [ "rsc_dep4", "Must (running + move)" ], [ "asymmetric", "Asymmetric - require explicit location constraints" ], ], [ [ "orphan-0", "Orphan ignore" ], [ "orphan-1", "Orphan stop" ], [ "orphan-2", "Orphan stop, remove failcount" ], ], [ [ "params-0", "Params: No change" ], [ "params-1", "Params: Changed" ], [ "params-2", "Params: Resource definition" ], [ "params-3", "Params: Restart instead of reload if start pending" ], [ "params-4", "Params: Reload" ], [ "params-5", "Params: Restart based on probe digest" ], [ "novell-251689", "Resource definition change + target_role=stopped" ], [ "bug-lf-2106", "Restart all anonymous clone instances after config change" ], [ "params-6", "Params: Detect reload in previously migrated resource" ], [ "nvpair-id-ref", "Support id-ref in nvpair with optional name" ], [ "not-reschedule-unneeded-monitor", "Do not reschedule unneeded monitors while resource definitions have changed" ], [ "reload-becomes-restart", "Cancel reload if restart becomes required" ], ], [ [ "target-0", "Target Role : baseline" ], [ "target-1", "Target Role : promoted" ], [ "target-2", "Target Role : invalid" ], ], [ [ "base-score", "Set a node's default score for all nodes" ], ], [ [ "date-1", "Dates", [ "-t", "2005-020" ] ], [ "date-2", "Date Spec - Pass", [ "-t", "2005-020T12:30" ] ], [ "date-3", "Date Spec - Fail", [ "-t", "2005-020T11:30" ] ], [ "origin", "Timing of recurring operations", [ "-t", "2014-05-07 00:28:00" ] ], [ "probe-0", "Probe (anon clone)" ], [ "probe-1", "Pending Probe" ], [ "probe-2", "Correctly re-probe cloned groups" ], [ "probe-3", "Probe (pending node)" ], [ "probe-4", "Probe (pending node + stopped resource)" ], [ "probe-pending-node", "Probe (pending node + unmanaged resource)" ], [ "failed-probe-primitive", "Maskable vs. unmaskable probe failures on primitive resources" ], [ "failed-probe-clone", "Maskable vs. unmaskable probe failures on cloned resources" ], [ "expired-failed-probe-primitive", "Maskable, expired probe failure on primitive resources" ], [ "standby", "Standby" ], [ "comments", "Comments" ], ], [ [ "one-or-more-0", "Everything starts" ], [ "one-or-more-1", "Nothing starts because of A" ], [ "one-or-more-2", "D can start because of C" ], [ "one-or-more-3", "D cannot start because of B and C" ], [ "one-or-more-4", "D cannot start because of target-role" ], [ "one-or-more-5", "Start A and F even though C and D are stopped" ], [ "one-or-more-6", "Leave A running even though B is stopped" ], [ "one-or-more-7", "Leave A running even though C is stopped" ], [ "bug-5140-require-all-false", "Allow basegrp:0 to stop" ], [ "clone-require-all-1", "clone B starts node 3 and 4" ], [ "clone-require-all-2", "clone B remains stopped everywhere" ], [ "clone-require-all-3", "clone B stops everywhere because A stops everywhere" ], [ "clone-require-all-4", "clone B remains on node 3 and 4 with only one instance of A remaining" ], [ "clone-require-all-5", "clone B starts on node 1 3 and 4" ], [ "clone-require-all-6", "clone B remains active after shutting down instances of A" ], [ "clone-require-all-7", "clone A and B both start at the same time. all instances of A start before B" ], [ "clone-require-all-no-interleave-1", "C starts everywhere after A and B" ], [ "clone-require-all-no-interleave-2", "C starts on nodes 1, 2, and 4 with only one active instance of B" ], [ "clone-require-all-no-interleave-3", "C remains active when instance of B is stopped on one node and started on another" ], [ "one-or-more-unrunnable-instances", "Avoid dependencies on instances that won't ever be started" ], ], [ [ "location-date-rules-1", "Use location constraints with ineffective date-based rules" ], [ "location-date-rules-2", "Use location constraints with effective date-based rules" ], [ "nvpair-date-rules-1", "Use nvpair blocks with a variety of date-based rules" ], [ "value-source", "Use location constraints with node attribute expressions using value-source" ], [ "rule-dbl-as-auto-number-match", "Floating-point rule values default to number comparison: match" ], [ "rule-dbl-as-auto-number-no-match", "Floating-point rule values default to number comparison: no " "match" ], [ "rule-dbl-as-integer-match", "Floating-point rule values set to integer comparison: match" ], [ "rule-dbl-as-integer-no-match", "Floating-point rule values set to integer comparison: no match" ], [ "rule-dbl-as-number-match", "Floating-point rule values set to number comparison: match" ], [ "rule-dbl-as-number-no-match", "Floating-point rule values set to number comparison: no match" ], [ "rule-dbl-parse-fail-default-str-match", "Floating-point rule values fail to parse, default to string " "comparison: match" ], [ "rule-dbl-parse-fail-default-str-no-match", "Floating-point rule values fail to parse, default to string " "comparison: no match" ], [ "rule-int-as-auto-integer-match", "Integer rule values default to integer comparison: match" ], [ "rule-int-as-auto-integer-no-match", "Integer rule values default to integer comparison: no match" ], [ "rule-int-as-integer-match", "Integer rule values set to integer comparison: match" ], [ "rule-int-as-integer-no-match", "Integer rule values set to integer comparison: no match" ], [ "rule-int-as-number-match", "Integer rule values set to number comparison: match" ], [ "rule-int-as-number-no-match", "Integer rule values set to number comparison: no match" ], [ "rule-int-parse-fail-default-str-match", "Integer rule values fail to parse, default to string " "comparison: match" ], [ "rule-int-parse-fail-default-str-no-match", "Integer rule values fail to parse, default to string " "comparison: no match" ], ], [ [ "order1", "Order start 1" ], [ "order2", "Order start 2" ], [ "order3", "Order stop" ], [ "order4", "Order (multiple)" ], [ "order5", "Order (move)" ], [ "order6", "Order (move w/ restart)" ], [ "order7", "Order (mandatory)" ], [ "order-optional", "Order (score=0)" ], [ "order-required", "Order (score=INFINITY)" ], [ "bug-lf-2171", "Prevent group start when clone is stopped" ], [ "order-clone", "Clone ordering should be able to prevent startup of dependent clones" ], [ "order-sets", "Ordering for resource sets" ], [ "order-serialize", "Serialize resources without inhibiting migration" ], [ "order-serialize-set", "Serialize a set of resources without inhibiting migration" ], [ "clone-order-primitive", "Order clone start after a primitive" ], [ "clone-order-16instances", "Verify ordering of 16 cloned resources" ], [ "order-optional-keyword", "Order (optional keyword)" ], [ "order-mandatory", "Order (mandatory keyword)" ], [ "bug-lf-2493", "Don't imply colocation requirements when applying ordering constraints with clones" ], [ "ordered-set-basic-startup", "Constraint set with default order settings" ], [ "ordered-set-natural", "Allow natural set ordering" ], [ "order-wrong-kind", "Order (error)" ], ], [ [ "coloc-loop", "Colocation - loop" ], [ "coloc-many-one", "Colocation - many-to-one" ], [ "coloc-list", "Colocation - many-to-one with list" ], [ "coloc-group", "Colocation - groups" ], [ "coloc-unpromoted-anti", "Anti-colocation with unpromoted shouldn't prevent promoted colocation" ], [ "coloc-attr", "Colocation based on node attributes" ], [ "coloc-negative-group", "Negative colocation with a group" ], [ "coloc-intra-set", "Intra-set colocation" ], [ "bug-lf-2435", "Colocation sets with a negative score" ], [ "coloc-clone-stays-active", "Ensure clones don't get stopped/demoted because a dependent must stop" ], [ "coloc_fp_logic", "Verify floating point calculations in colocation are working" ], [ "colo_promoted_w_native", "cl#5070 - Verify promotion order is affected when colocating promoted with primitive" ], [ "colo_unpromoted_w_native", "cl#5070 - Verify promotion order is affected when colocating unpromoted with primitive" ], [ "anti-colocation-order", "cl#5187 - Prevent resources in an anti-colocation from even temporarily running on a same node" ], [ "anti-colocation-promoted", "Organize order of actions for promoted resources in anti-colocations" ], [ "anti-colocation-unpromoted", "Organize order of actions for unpromoted resources in anti-colocations" ], [ "enforce-colo1", "Always enforce B with A INFINITY" ], [ "complex_enforce_colo", "Always enforce B with A INFINITY. (make sure heat-engine stops)" ], [ "coloc-dependee-should-stay", "Stickiness outweighs group colocation" ], [ "coloc-dependee-should-move", "Group colocation outweighs stickiness" ], [ "colocation-influence", "Respect colocation influence" ], ], [ [ "rsc-sets-seq-true", "Resource Sets - sequential=false" ], [ "rsc-sets-seq-false", "Resource Sets - sequential=true" ], [ "rsc-sets-clone", "Resource Sets - Clone" ], [ "rsc-sets-promoted", "Resource Sets - Promoted" ], [ "rsc-sets-clone-1", "Resource Sets - Clone (lf#2404)" ], ], [ [ "attrs1", "string: eq (and)" ], [ "attrs2", "string: lt / gt (and)" ], [ "attrs3", "string: ne (or)" ], [ "attrs4", "string: exists" ], [ "attrs5", "string: not_exists" ], [ "attrs6", "is_dc: true" ], [ "attrs7", "is_dc: false" ], [ "attrs8", "score_attribute" ], [ "per-node-attrs", "Per node resource parameters" ], ], [ [ "mon-rsc-1", "Schedule Monitor - start" ], [ "mon-rsc-2", "Schedule Monitor - move" ], [ "mon-rsc-3", "Schedule Monitor - pending start" ], [ "mon-rsc-4", "Schedule Monitor - move/pending start" ], ], [ [ "rec-rsc-0", "Resource Recover - no start" ], [ "rec-rsc-1", "Resource Recover - start" ], [ "rec-rsc-2", "Resource Recover - monitor" ], [ "rec-rsc-3", "Resource Recover - stop - ignore" ], [ "rec-rsc-4", "Resource Recover - stop - block" ], [ "rec-rsc-5", "Resource Recover - stop - fence" ], [ "rec-rsc-6", "Resource Recover - multiple - restart" ], [ "rec-rsc-7", "Resource Recover - multiple - stop" ], [ "rec-rsc-8", "Resource Recover - multiple - block" ], [ "rec-rsc-9", "Resource Recover - group/group" ], [ "stop-unexpected", "Recover multiply active group with stop_unexpected" ], [ "stop-unexpected-2", "Resource multiply active primitve with stop_unexpected" ], [ "monitor-recovery", "on-fail=block + resource recovery detected by recurring monitor" ], [ "stop-failure-no-quorum", "Stop failure without quorum" ], [ "stop-failure-no-fencing", "Stop failure without fencing available" ], [ "stop-failure-with-fencing", "Stop failure with fencing available" ], [ "multiple-active-block-group", "Support of multiple-active=block for resource groups" ], [ "multiple-monitor-one-failed", "Consider resource failed if any of the configured monitor operations failed" ], ], [ [ "quorum-1", "No quorum - ignore" ], [ "quorum-2", "No quorum - freeze" ], [ "quorum-3", "No quorum - stop" ], [ "quorum-4", "No quorum - start anyway" ], [ "quorum-5", "No quorum - start anyway (group)" ], [ "quorum-6", "No quorum - start anyway (clone)" ], [ "bug-cl-5212", "No promotion with no-quorum-policy=freeze" ], [ "suicide-needed-inquorate", "no-quorum-policy=suicide: suicide necessary" ], [ "suicide-not-needed-initial-quorum", "no-quorum-policy=suicide: suicide not necessary at initial quorum" ], [ "suicide-not-needed-never-quorate", "no-quorum-policy=suicide: suicide not necessary if never quorate" ], [ "suicide-not-needed-quorate", "no-quorum-policy=suicide: suicide necessary if quorate" ], ], [ [ "rec-node-1", "Node Recover - Startup - no fence" ], [ "rec-node-2", "Node Recover - Startup - fence" ], [ "rec-node-3", "Node Recover - HA down - no fence" ], [ "rec-node-4", "Node Recover - HA down - fence" ], [ "rec-node-5", "Node Recover - CRM down - no fence" ], [ "rec-node-6", "Node Recover - CRM down - fence" ], [ "rec-node-7", "Node Recover - no quorum - ignore" ], [ "rec-node-8", "Node Recover - no quorum - freeze" ], [ "rec-node-9", "Node Recover - no quorum - stop" ], [ "rec-node-10", "Node Recover - no quorum - stop w/fence" ], [ "rec-node-11", "Node Recover - CRM down w/ group - fence" ], [ "rec-node-12", "Node Recover - nothing active - fence" ], [ "rec-node-13", "Node Recover - failed resource + shutdown - fence" ], [ "rec-node-15", "Node Recover - unknown lrm section" ], [ "rec-node-14", "Serialize all stonith's" ], ], [ [ "multi1", "Multiple Active (stop/start)" ], ], [ [ "migrate-begin", "Normal migration" ], [ "migrate-success", "Completed migration" ], [ "migrate-partial-1", "Completed migration, missing stop on source" ], [ "migrate-partial-2", "Successful migrate_to only" ], [ "migrate-partial-3", "Successful migrate_to only, target down" ], [ "migrate-partial-4", "Migrate from the correct host after migrate_to+migrate_from" ], [ "bug-5186-partial-migrate", "Handle partial migration when src node loses membership" ], [ "migrate-fail-2", "Failed migrate_from" ], [ "migrate-fail-3", "Failed migrate_from + stop on source" ], [ "migrate-fail-4", "Failed migrate_from + stop on target - ideally we wouldn't need to re-stop on target" ], [ "migrate-fail-5", "Failed migrate_from + stop on source and target" ], [ "migrate-fail-6", "Failed migrate_to" ], [ "migrate-fail-7", "Failed migrate_to + stop on source" ], [ "migrate-fail-8", "Failed migrate_to + stop on target - ideally we wouldn't need to re-stop on target" ], [ "migrate-fail-9", "Failed migrate_to + stop on source and target" ], [ "migration-ping-pong", "Old migrate_to failure + successful migrate_from on same node" ], [ "migrate-stop", "Migration in a stopping stack" ], [ "migrate-start", "Migration in a starting stack" ], [ "migrate-stop_start", "Migration in a restarting stack" ], [ "migrate-stop-complex", "Migration in a complex stopping stack" ], [ "migrate-start-complex", "Migration in a complex starting stack" ], [ "migrate-stop-start-complex", "Migration in a complex moving stack" ], [ "migrate-shutdown", "Order the post-migration 'stop' before node shutdown" ], [ "migrate-1", "Migrate (migrate)" ], [ "migrate-2", "Migrate (stable)" ], [ "migrate-3", "Migrate (failed migrate_to)" ], [ "migrate-4", "Migrate (failed migrate_from)" ], [ "novell-252693", "Migration in a stopping stack" ], [ "novell-252693-2", "Migration in a starting stack" ], [ "novell-252693-3", "Non-Migration in a starting and stopping stack" ], [ "bug-1820", "Migration in a group" ], [ "bug-1820-1", "Non-migration in a group" ], [ "migrate-5", "Primitive migration with a clone" ], [ "migrate-fencing", "Migration after Fencing" ], [ "migrate-both-vms", "Migrate two VMs that have no colocation" ], [ "migration-behind-migrating-remote", "Migrate resource behind migrating remote connection" ], [ "1-a-then-bm-move-b", "Advanced migrate logic. A then B. migrate B" ], [ "2-am-then-b-move-a", "Advanced migrate logic, A then B, migrate A without stopping B" ], [ "3-am-then-bm-both-migrate", "Advanced migrate logic. A then B. migrate both" ], [ "4-am-then-bm-b-not-migratable", "Advanced migrate logic, A then B, B not migratable" ], [ "5-am-then-bm-a-not-migratable", "Advanced migrate logic. A then B. move both, a not migratable" ], [ "6-migrate-group", "Advanced migrate logic, migrate a group" ], [ "7-migrate-group-one-unmigratable", "Advanced migrate logic, migrate group mixed with allow-migrate true/false" ], [ "8-am-then-bm-a-migrating-b-stopping", "Advanced migrate logic, A then B, A migrating, B stopping" ], [ "9-am-then-bm-b-migrating-a-stopping", "Advanced migrate logic, A then B, B migrate, A stopping" ], [ "10-a-then-bm-b-move-a-clone", "Advanced migrate logic, A clone then B, migrate B while stopping A" ], [ "11-a-then-bm-b-move-a-clone-starting", "Advanced migrate logic, A clone then B, B moving while A is start/stopping" ], [ "a-promote-then-b-migrate", "A promote then B start. migrate B" ], [ "a-demote-then-b-migrate", "A demote then B stop. migrate B" ], [ "probe-target-of-failed-migrate_to-1", "Failed migrate_to, target rejoins" ], [ "probe-target-of-failed-migrate_to-2", "Failed migrate_to, target rejoined and probed" ], [ "partial-live-migration-multiple-active", "Prevent running on multiple nodes due to partial live migration" ], # @TODO: If pacemaker implements versioned attributes, uncomment this test #[ "migrate-versioned", "Disable migration for versioned resources" ], [ "bug-lf-2422", "Dependency on partially active group - stop ocfs:*" ], ], [ [ "clone-anon-probe-1", "Probe the correct (anonymous) clone instance for each node" ], [ "clone-anon-probe-2", "Avoid needless re-probing of anonymous clones" ], [ "clone-anon-failcount", "Merge failcounts for anonymous clones" ], [ "force-anon-clone-max", "Update clone-max properly when forcing a clone to be anonymous" ], [ "anon-instance-pending", "Assign anonymous clone instance numbers properly when action pending" ], [ "inc0", "Incarnation start" ], [ "inc1", "Incarnation start order" ], [ "inc2", "Incarnation silent restart, stop, move" ], [ "inc3", "Inter-incarnation ordering, silent restart, stop, move" ], [ "inc4", "Inter-incarnation ordering, silent restart, stop, move (ordered)" ], [ "inc5", "Inter-incarnation ordering, silent restart, stop, move (restart 1)" ], [ "inc6", "Inter-incarnation ordering, silent restart, stop, move (restart 2)" ], [ "inc7", "Clone colocation" ], [ "inc8", "Clone anti-colocation" ], [ "inc9", "Non-unique clone" ], [ "inc10", "Non-unique clone (stop)" ], [ "inc11", "Primitive colocation with clones" ], [ "inc12", "Clone shutdown" ], [ "cloned-group", "Make sure only the correct number of cloned groups are started" ], [ "cloned-group-stop", "Ensure stopping qpidd also stops glance and cinder" ], [ "clone-no-shuffle", "Don't prioritize allocation of instances that must be moved" ], [ "clone-max-zero", "Orphan processing with clone-max=0" ], [ "clone-anon-dup", "Bug LF#2087 - Correctly parse the state of anonymous clones that are active more than once per node" ], [ "bug-lf-2160", "Don't shuffle clones due to colocation" ], [ "bug-lf-2213", "clone-node-max enforcement for cloned groups" ], [ "bug-lf-2153", "Clone ordering constraints" ], [ "bug-lf-2361", "Ensure clones observe mandatory ordering constraints if the LHS is unrunnable" ], [ "bug-lf-2317", "Avoid needless restart of primitive depending on a clone" ], [ "clone-colocate-instance-1", "Colocation with a specific clone instance (negative example)" ], [ "clone-colocate-instance-2", "Colocation with a specific clone instance" ], [ "clone-order-instance", "Ordering with specific clone instances" ], [ "bug-lf-2453", "Enforce mandatory clone ordering without colocation" ], [ "bug-lf-2508", "Correctly reconstruct the status of anonymous cloned groups" ], [ "bug-lf-2544", "Balanced clone placement" ], [ "bug-lf-2445", "Redistribute clones with node-max > 1 and stickiness = 0" ], [ "bug-lf-2574", "Avoid clone shuffle" ], [ "bug-lf-2581", "Avoid group restart due to unrelated clone (re)start" ], [ "bug-cl-5168", "Don't shuffle clones" ], [ "bug-cl-5170", "Prevent clone from starting with on-fail=block" ], [ "clone-fail-block-colocation", "Move colocated group when failed clone has on-fail=block" ], [ "clone-interleave-1", "Clone-3 cannot start on pcmk-1 due to interleaved ordering (no colocation)" ], [ "clone-interleave-2", "Clone-3 must stop on pcmk-1 due to interleaved ordering (no colocation)" ], [ "clone-interleave-3", "Clone-3 must be recovered on pcmk-1 due to interleaved ordering (no colocation)" ], [ "rebalance-unique-clones", "Rebalance unique clone instances with no stickiness" ], [ "clone-requires-quorum-recovery", "Clone with requires=quorum on failed node needing recovery" ], [ "clone-requires-quorum", "Clone with requires=quorum with presumed-inactive instance on failed node" ], ], [ [ "cloned_start_one", "order first clone then clone... first clone_min=2" ], [ "cloned_start_two", "order first clone then clone... first clone_min=2" ], [ "cloned_stop_one", "order first clone then clone... first clone_min=2" ], [ "cloned_stop_two", "order first clone then clone... first clone_min=2" ], [ "clone_min_interleave_start_one", "order first clone then clone... first clone_min=2 and then has interleave=true" ], [ "clone_min_interleave_start_two", "order first clone then clone... first clone_min=2 and then has interleave=true" ], [ "clone_min_interleave_stop_one", "order first clone then clone... first clone_min=2 and then has interleave=true" ], [ "clone_min_interleave_stop_two", "order first clone then clone... first clone_min=2 and then has interleave=true" ], [ "clone_min_start_one", "order first clone then primitive... first clone_min=2" ], [ "clone_min_start_two", "order first clone then primitive... first clone_min=2" ], [ "clone_min_stop_all", "order first clone then primitive... first clone_min=2" ], [ "clone_min_stop_one", "order first clone then primitive... first clone_min=2" ], [ "clone_min_stop_two", "order first clone then primitive... first clone_min=2" ], ], [ [ "unfence-startup", "Clean unfencing" ], [ "unfence-definition", "Unfencing when the agent changes" ], [ "unfence-parameters", "Unfencing when the agent parameters changes" ], [ "unfence-device", "Unfencing when a cluster has only fence devices" ], ], [ [ "promoted-0", "Stopped -> Unpromoted" ], [ "promoted-1", "Stopped -> Promote" ], [ "promoted-2", "Stopped -> Promote : notify" ], [ "promoted-3", "Stopped -> Promote : promoted location" ], [ "promoted-4", "Started -> Promote : promoted location" ], [ "promoted-5", "Promoted -> Promoted" ], [ "promoted-6", "Promoted -> Promoted (2)" ], [ "promoted-7", "Promoted -> Fenced" ], [ "promoted-8", "Promoted -> Fenced -> Moved" ], [ "promoted-9", "Stopped + Promotable + No quorum" ], [ "promoted-10", "Stopped -> Promotable : notify with monitor" ], [ "promoted-11", "Stopped -> Promote : colocation" ], [ "novell-239082", "Demote/Promote ordering" ], [ "novell-239087", "Stable promoted placement" ], [ "promoted-12", "Promotion based solely on rsc_location constraints" ], [ "promoted-13", "Include preferences of colocated resources when placing promoted" ], [ "promoted-demote", "Ordering when actions depends on demoting an unpromoted resource" ], [ "promoted-ordering", "Prevent resources from starting that need a promoted" ], [ "bug-1765", "Verify promoted-with-promoted colocation does not stop unpromoted instances" ], [ "promoted-group", "Promotion of cloned groups" ], [ "bug-lf-1852", "Don't shuffle promotable instances unnecessarily" ], [ "promoted-failed-demote", "Don't retry failed demote actions" ], [ "promoted-failed-demote-2", "Don't retry failed demote actions (notify=false)" ], [ "promoted-depend", "Ensure resources that depend on promoted instance don't get allocated until that does" ], [ "promoted-reattach", "Re-attach to a running promoted" ], [ "promoted-allow-start", "Don't include promoted score if it would prevent allocation" ], [ "promoted-colocation", "Allow promoted instances placemaker to be influenced by colocation constraints" ], [ "promoted-pseudo", "Make sure promote/demote pseudo actions are created correctly" ], [ "promoted-role", "Prevent target-role from promoting more than promoted-max instances" ], [ "bug-lf-2358", "Anti-colocation of promoted instances" ], [ "promoted-promotion-constraint", "Mandatory promoted colocation constraints" ], [ "unmanaged-promoted", "Ensure role is preserved for unmanaged resources" ], [ "promoted-unmanaged-monitor", "Start correct monitor for unmanaged promoted instances" ], [ "promoted-demote-2", "Demote does not clear past failure" ], [ "promoted-move", "Move promoted based on failure of colocated group" ], [ "promoted-probed-score", "Observe the promotion score of probed resources" ], [ "colocation_constraint_stops_promoted", "cl#5054 - Ensure promoted is demoted when stopped by colocation constraint" ], [ "colocation_constraint_stops_unpromoted", "cl#5054 - Ensure unpromoted is not demoted when stopped by colocation constraint" ], [ "order_constraint_stops_promoted", "cl#5054 - Ensure promoted is demoted when stopped by order constraint" ], [ "order_constraint_stops_unpromoted", "cl#5054 - Ensure unpromoted is not demoted when stopped by order constraint" ], [ "promoted_monitor_restart", "cl#5072 - Ensure promoted monitor operation will start after promotion" ], [ "bug-rh-880249", "Handle replacement of an m/s resource with a primitive" ], [ "bug-5143-ms-shuffle", "Prevent promoted instance shuffling due to promotion score" ], [ "promoted-demote-block", "Block promotion if demote fails with on-fail=block" ], [ "promoted-dependent-ban", "Don't stop instances from being active because a dependent is banned from that host" ], [ "promoted-stop", "Stop instances due to location constraint with role=Started" ], [ "promoted-partially-demoted-group", "Allow partially demoted group to finish demoting" ], [ "bug-cl-5213", "Ensure role colocation with -INFINITY is enforced" ], [ "bug-cl-5219", "Allow unrelated resources with a common colocation target to remain promoted" ], [ "promoted-asymmetrical-order", "Fix the behaviors of multi-state resources with asymmetrical ordering" ], [ "promoted-notify", "Promotion with notifications" ], [ "promoted-score-startup", "Use permanent promoted scores without LRM history" ], [ "failed-demote-recovery", "Recover resource in unpromoted role after demote fails" ], [ "failed-demote-recovery-promoted", "Recover resource in promoted role after demote fails" ], [ "on_fail_demote1", "Recovery with on-fail=\"demote\" on healthy cluster, remote, guest, and bundle nodes" ], [ "on_fail_demote2", "Recovery with on-fail=\"demote\" with promotion on different node" ], [ "on_fail_demote3", "Recovery with on-fail=\"demote\" with no promotion" ], [ "on_fail_demote4", "Recovery with on-fail=\"demote\" on failed cluster, remote, guest, and bundle nodes" ], [ "no_quorum_demote", "Promotable demotion and primitive stop with no-quorum-policy=\"demote\"" ], [ "no-promote-on-unrunnable-guest", "Don't select bundle instance for promotion when container can't run" ], ], [ [ "history-1", "Correctly parse stateful-1 resource state" ], ], [ [ "managed-0", "Managed (reference)" ], [ "managed-1", "Not managed - down" ], [ "managed-2", "Not managed - up" ], [ "bug-5028", "Shutdown should block if anything depends on an unmanaged resource" ], [ "bug-5028-detach", "Ensure detach still works" ], [ "bug-5028-bottom", "Ensure shutdown still blocks if the blocked resource is at the bottom of the stack" ], [ "unmanaged-stop-1", "cl#5155 - Block the stop of resources if any depending resource is unmanaged" ], [ "unmanaged-stop-2", "cl#5155 - Block the stop of resources if the first resource in a mandatory stop order is unmanaged" ], [ "unmanaged-stop-3", "cl#5155 - Block the stop of resources if any depending resource in a group is unmanaged" ], [ "unmanaged-stop-4", "cl#5155 - Block the stop of resources if any depending resource in the middle of a group is unmanaged" ], [ "unmanaged-block-restart", "Block restart of resources if any dependent resource in a group is unmanaged" ], ], [ [ "interleave-0", "Interleave (reference)" ], [ "interleave-1", "coloc - not interleaved" ], [ "interleave-2", "coloc - interleaved" ], [ "interleave-3", "coloc - interleaved (2)" ], [ "interleave-pseudo-stop", "Interleaved clone during stonith" ], [ "interleave-stop", "Interleaved clone during stop" ], [ "interleave-restart", "Interleaved clone during dependency restart" ], ], [ [ "notify-0", "Notify reference" ], [ "notify-1", "Notify simple" ], [ "notify-2", "Notify simple, confirm" ], [ "notify-3", "Notify move, confirm" ], [ "novell-239079", "Notification priority" ], #[ "notify-2", "Notify - 764" ], [ "notifs-for-unrunnable", "Don't schedule notifications for an unrunnable action" ], [ "route-remote-notify", "Route remote notify actions through correct cluster node" ], [ "notify-behind-stopping-remote", "Don't schedule notifications behind stopped remote" ], ], [ [ "594", "OSDL #594 - Unrunnable actions scheduled in transition" ], [ "662", "OSDL #662 - Two resources start on one node when incarnation_node_max = 1" ], [ "696", "OSDL #696 - CRM starts stonith RA without monitor" ], [ "726", "OSDL #726 - Attempting to schedule rsc_posic041_monitor_5000 _after_ a stop" ], [ "735", "OSDL #735 - Correctly detect that rsc_hadev1 is stopped on hadev3" ], [ "764", "OSDL #764 - Missing monitor op for DoFencing:child_DoFencing:1" ], [ "797", "OSDL #797 - Assert triggered: task_id_i > max_call_id" ], [ "829", "OSDL #829" ], [ "994", "OSDL #994 - Stopping the last resource in a resource group causes the entire group to be restarted" ], [ "994-2", "OSDL #994 - with a dependent resource" ], [ "1360", "OSDL #1360 - Clone stickiness" ], [ "1484", "OSDL #1484 - on_fail=stop" ], [ "1494", "OSDL #1494 - Clone stability" ], [ "unrunnable-1", "Unrunnable" ], [ "unrunnable-2", "Unrunnable 2" ], [ "stonith-0", "Stonith loop - 1" ], [ "stonith-1", "Stonith loop - 2" ], [ "stonith-2", "Stonith loop - 3" ], [ "stonith-3", "Stonith startup" ], [ "stonith-4", "Stonith node state" ], [ "dc-fence-ordering", "DC needs fencing while other nodes are shutting down" ], [ "bug-1572-1", "Recovery of groups depending on promotable role" ], [ "bug-1572-2", "Recovery of groups depending on promotable role when promoted is not re-promoted" ], [ "bug-1685", "Depends-on-promoted ordering" ], [ "bug-1822", "Don't promote partially active groups" ], [ "bug-pm-11", "New resource added to a m/s group" ], [ "bug-pm-12", "Recover only the failed portion of a cloned group" ], [ "bug-n-387749", "Don't shuffle clone instances" ], [ "bug-n-385265", "Don't ignore the failure stickiness of group children - resource_idvscommon should stay stopped" ], [ "bug-n-385265-2", "Ensure groups are migrated instead of remaining partially active on the current node" ], [ "bug-lf-1920", "Correctly handle probes that find active resources" ], [ "bnc-515172", "Location constraint with multiple expressions" ], [ "colocate-primitive-with-clone", "Optional colocation with a clone" ], [ "use-after-free-merge", "Use-after-free in native_merge_weights" ], [ "bug-lf-2551", "STONITH ordering for stop" ], [ "bug-lf-2606", "Stonith implies demote" ], [ "bug-lf-2474", "Ensure resource op timeout takes precedence over op_defaults" ], [ "bug-suse-707150", "Prevent vm-01 from starting due to colocation/ordering" ], [ "bug-5014-A-start-B-start", "Verify when A starts B starts using symmetrical=false" ], [ "bug-5014-A-stop-B-started", "Verify when A stops B does not stop if it has already started using symmetric=false" ], [ "bug-5014-A-stopped-B-stopped", "Verify when A is stopped and B has not started, B does not start before A using symmetric=false" ], [ "bug-5014-CthenAthenB-C-stopped", "Verify when C then A is symmetrical=true, A then B is symmetric=false, and C is stopped that nothing starts" ], [ "bug-5014-CLONE-A-start-B-start", "Verify when A starts B starts using clone resources with symmetric=false" ], [ "bug-5014-CLONE-A-stop-B-started", "Verify when A stops B does not stop if it has already started using clone resources with symmetric=false" ], [ "bug-5014-GROUP-A-start-B-start", "Verify when A starts B starts when using group resources with symmetric=false" ], [ "bug-5014-GROUP-A-stopped-B-started", "Verify when A stops B does not stop if it has already started using group resources with symmetric=false" ], [ "bug-5014-GROUP-A-stopped-B-stopped", "Verify when A is stopped and B has not started, B does not start before A using group resources with symmetric=false" ], [ "bug-5014-ordered-set-symmetrical-false", "Verify ordered sets work with symmetrical=false" ], [ "bug-5014-ordered-set-symmetrical-true", "Verify ordered sets work with symmetrical=true" ], [ "clbz5007-promotable-colocation", "Verify use of colocation scores other than INFINITY and -INFINITY work on multi-state resources" ], [ "bug-5038", "Prevent restart of anonymous clones when clone-max decreases" ], [ "bug-5025-1", "Automatically clean up failcount after resource config change with reload" ], [ "bug-5025-2", "Make sure clear failcount action isn't set when config does not change" ], [ "bug-5025-3", "Automatically clean up failcount after resource config change with restart" ], [ "bug-5025-4", "Clear failcount when last failure is a start op and rsc attributes changed" ], [ "failcount", "Ensure failcounts are correctly expired" ], [ "failcount-block", "Ensure failcounts are not expired when on-fail=block is present" ], [ "per-op-failcount", "Ensure per-operation failcount is handled and not passed to fence agent" ], [ "on-fail-ignore", "Ensure on-fail=ignore works even beyond migration-threshold" ], [ "monitor-onfail-restart", "bug-5058 - Monitor failure with on-fail set to restart" ], [ "monitor-onfail-stop", "bug-5058 - Monitor failure wiht on-fail set to stop" ], [ "bug-5059", "No need to restart p_stateful1:*" ], [ "bug-5069-op-enabled", "Test on-fail=ignore with failure when monitor is enabled" ], [ "bug-5069-op-disabled", "Test on-fail-ignore with failure when monitor is disabled" ], [ "obsolete-lrm-resource", "cl#5115 - Do not use obsolete lrm_resource sections" ], [ "expire-non-blocked-failure", "Ignore failure-timeout only if the failed operation has on-fail=block" ], [ "asymmetrical-order-move", "Respect asymmetrical ordering when trying to move resources" ], [ "asymmetrical-order-restart", "Respect asymmetrical ordering when restarting dependent resource" ], [ "start-then-stop-with-unfence", "Avoid graph loop with start-then-stop constraint plus unfencing" ], [ "order-expired-failure", "Order failcount cleanup after remote fencing" ], [ "ignore_stonith_rsc_order1", "cl#5056- Ignore order constraint between stonith and non-stonith rsc" ], [ "ignore_stonith_rsc_order2", "cl#5056- Ignore order constraint with group rsc containing mixed stonith and non-stonith" ], [ "ignore_stonith_rsc_order3", "cl#5056- Ignore order constraint, stonith clone and mixed group" ], [ "ignore_stonith_rsc_order4", "cl#5056- Ignore order constraint, stonith clone and clone with nested mixed group" ], [ "honor_stonith_rsc_order1", "cl#5056- Honor order constraint, stonith clone and pure stonith group(single rsc)" ], [ "honor_stonith_rsc_order2", "cl#5056- Honor order constraint, stonith clone and pure stonith group(multiple rsc)" ], [ "honor_stonith_rsc_order3", "cl#5056- Honor order constraint, stonith clones with nested pure stonith group" ], [ "honor_stonith_rsc_order4", "cl#5056- Honor order constraint, between two native stonith rscs" ], [ "multiply-active-stonith", "Multiply active stonith" ], [ "probe-timeout", "cl#5099 - Default probe timeout" ], [ "order-first-probes", "cl#5301 - respect order constraints when relevant resources are being probed" ], [ "concurrent-fencing", "Allow performing fencing operations in parallel" ], [ "priority-fencing-delay", "Delay fencing targeting the more significant node" ], ], [ [ "systemhealth1", "System Health () #1" ], [ "systemhealth2", "System Health () #2" ], [ "systemhealth3", "System Health () #3" ], [ "systemhealthn1", "System Health (None) #1" ], [ "systemhealthn2", "System Health (None) #2" ], [ "systemhealthn3", "System Health (None) #3" ], [ "systemhealthm1", "System Health (Migrate On Red) #1" ], [ "systemhealthm2", "System Health (Migrate On Red) #2" ], [ "systemhealthm3", "System Health (Migrate On Red) #3" ], [ "systemhealtho1", "System Health (Only Green) #1" ], [ "systemhealtho2", "System Health (Only Green) #2" ], [ "systemhealtho3", "System Health (Only Green) #3" ], [ "systemhealthp1", "System Health (Progessive) #1" ], [ "systemhealthp2", "System Health (Progessive) #2" ], [ "systemhealthp3", "System Health (Progessive) #3" ], [ "allow-unhealthy-nodes", "System Health (migrate-on-red + allow-unhealth-nodes)" ], ], [ [ "utilization", "Placement Strategy - utilization" ], [ "minimal", "Placement Strategy - minimal" ], [ "balanced", "Placement Strategy - balanced" ], ], [ [ "placement-stickiness", "Optimized Placement Strategy - stickiness" ], [ "placement-priority", "Optimized Placement Strategy - priority" ], [ "placement-location", "Optimized Placement Strategy - location" ], [ "placement-capacity", "Optimized Placement Strategy - capacity" ], ], [ [ "utilization-order1", "Utilization Order - Simple" ], [ "utilization-order2", "Utilization Order - Complex" ], [ "utilization-order3", "Utilization Order - Migrate" ], [ "utilization-order4", "Utilization Order - Live Migration (bnc#695440)" ], [ "utilization-complex", "Utilization with complex relationships" ], [ "utilization-shuffle", "Don't displace prmExPostgreSQLDB2 on act2, Start prmExPostgreSQLDB1 on act3" ], [ "load-stopped-loop", "Avoid transition loop due to load_stopped (cl#5044)" ], [ "load-stopped-loop-2", "cl#5235 - Prevent graph loops that can be introduced by load_stopped -> migrate_to ordering" ], ], [ [ "colocated-utilization-primitive-1", "Colocated Utilization - Primitive" ], [ "colocated-utilization-primitive-2", "Colocated Utilization - Choose the most capable node" ], [ "colocated-utilization-group", "Colocated Utilization - Group" ], [ "colocated-utilization-clone", "Colocated Utilization - Clone" ], [ "utilization-check-allowed-nodes", "Only check the capacities of the nodes that can run the resource" ], ], [ [ "reprobe-target_rc", "Ensure correct target_rc for reprobe of inactive resources" ], [ "node-maintenance-1", "cl#5128 - Node maintenance" ], [ "node-maintenance-2", "cl#5128 - Node maintenance (coming out of maintenance mode)" ], [ "shutdown-maintenance-node", "Do not fence a maintenance node if it shuts down cleanly" ], [ "rsc-maintenance", "Per-resource maintenance" ], ], [ [ "not-installed-agent", "The resource agent is missing" ], [ "not-installed-tools", "Something the resource agent needs is missing" ], ], [ [ "stopped-monitor-00", "Stopped Monitor - initial start" ], [ "stopped-monitor-01", "Stopped Monitor - failed started" ], [ "stopped-monitor-02", "Stopped Monitor - started multi-up" ], [ "stopped-monitor-03", "Stopped Monitor - stop started" ], [ "stopped-monitor-04", "Stopped Monitor - failed stop" ], [ "stopped-monitor-05", "Stopped Monitor - start unmanaged" ], [ "stopped-monitor-06", "Stopped Monitor - unmanaged multi-up" ], [ "stopped-monitor-07", "Stopped Monitor - start unmanaged multi-up" ], [ "stopped-monitor-08", "Stopped Monitor - migrate" ], [ "stopped-monitor-09", "Stopped Monitor - unmanage started" ], [ "stopped-monitor-10", "Stopped Monitor - unmanaged started multi-up" ], [ "stopped-monitor-11", "Stopped Monitor - stop unmanaged started" ], [ "stopped-monitor-12", "Stopped Monitor - unmanaged started multi-up (target-role=Stopped)" ], [ "stopped-monitor-20", "Stopped Monitor - initial stop" ], [ "stopped-monitor-21", "Stopped Monitor - stopped single-up" ], [ "stopped-monitor-22", "Stopped Monitor - stopped multi-up" ], [ "stopped-monitor-23", "Stopped Monitor - start stopped" ], [ "stopped-monitor-24", "Stopped Monitor - unmanage stopped" ], [ "stopped-monitor-25", "Stopped Monitor - unmanaged stopped multi-up" ], [ "stopped-monitor-26", "Stopped Monitor - start unmanaged stopped" ], [ "stopped-monitor-27", "Stopped Monitor - unmanaged stopped multi-up (target-role=Started)" ], [ "stopped-monitor-30", "Stopped Monitor - new node started" ], [ "stopped-monitor-31", "Stopped Monitor - new node stopped" ], ], [ # This is a combo test to check: # - probe timeout defaults to the minimum-interval monitor's # - duplicate recurring operations are ignored # - if timeout spec is bad, the default timeout is used # - failure is blocked with on-fail=block even if ISO8601 interval is specified # - started/stopped role monitors are started/stopped on right nodes [ "intervals", "Recurring monitor interval handling" ], ], [ [ "ticket-primitive-1", "Ticket - Primitive (loss-policy=stop, initial)" ], [ "ticket-primitive-2", "Ticket - Primitive (loss-policy=stop, granted)" ], [ "ticket-primitive-3", "Ticket - Primitive (loss-policy-stop, revoked)" ], [ "ticket-primitive-4", "Ticket - Primitive (loss-policy=demote, initial)" ], [ "ticket-primitive-5", "Ticket - Primitive (loss-policy=demote, granted)" ], [ "ticket-primitive-6", "Ticket - Primitive (loss-policy=demote, revoked)" ], [ "ticket-primitive-7", "Ticket - Primitive (loss-policy=fence, initial)" ], [ "ticket-primitive-8", "Ticket - Primitive (loss-policy=fence, granted)" ], [ "ticket-primitive-9", "Ticket - Primitive (loss-policy=fence, revoked)" ], [ "ticket-primitive-10", "Ticket - Primitive (loss-policy=freeze, initial)" ], [ "ticket-primitive-11", "Ticket - Primitive (loss-policy=freeze, granted)" ], [ "ticket-primitive-12", "Ticket - Primitive (loss-policy=freeze, revoked)" ], [ "ticket-primitive-13", "Ticket - Primitive (loss-policy=stop, standby, granted)" ], [ "ticket-primitive-14", "Ticket - Primitive (loss-policy=stop, granted, standby)" ], [ "ticket-primitive-15", "Ticket - Primitive (loss-policy=stop, standby, revoked)" ], [ "ticket-primitive-16", "Ticket - Primitive (loss-policy=demote, standby, granted)" ], [ "ticket-primitive-17", "Ticket - Primitive (loss-policy=demote, granted, standby)" ], [ "ticket-primitive-18", "Ticket - Primitive (loss-policy=demote, standby, revoked)" ], [ "ticket-primitive-19", "Ticket - Primitive (loss-policy=fence, standby, granted)" ], [ "ticket-primitive-20", "Ticket - Primitive (loss-policy=fence, granted, standby)" ], [ "ticket-primitive-21", "Ticket - Primitive (loss-policy=fence, standby, revoked)" ], [ "ticket-primitive-22", "Ticket - Primitive (loss-policy=freeze, standby, granted)" ], [ "ticket-primitive-23", "Ticket - Primitive (loss-policy=freeze, granted, standby)" ], [ "ticket-primitive-24", "Ticket - Primitive (loss-policy=freeze, standby, revoked)" ], ], [ [ "ticket-group-1", "Ticket - Group (loss-policy=stop, initial)" ], [ "ticket-group-2", "Ticket - Group (loss-policy=stop, granted)" ], [ "ticket-group-3", "Ticket - Group (loss-policy-stop, revoked)" ], [ "ticket-group-4", "Ticket - Group (loss-policy=demote, initial)" ], [ "ticket-group-5", "Ticket - Group (loss-policy=demote, granted)" ], [ "ticket-group-6", "Ticket - Group (loss-policy=demote, revoked)" ], [ "ticket-group-7", "Ticket - Group (loss-policy=fence, initial)" ], [ "ticket-group-8", "Ticket - Group (loss-policy=fence, granted)" ], [ "ticket-group-9", "Ticket - Group (loss-policy=fence, revoked)" ], [ "ticket-group-10", "Ticket - Group (loss-policy=freeze, initial)" ], [ "ticket-group-11", "Ticket - Group (loss-policy=freeze, granted)" ], [ "ticket-group-12", "Ticket - Group (loss-policy=freeze, revoked)" ], [ "ticket-group-13", "Ticket - Group (loss-policy=stop, standby, granted)" ], [ "ticket-group-14", "Ticket - Group (loss-policy=stop, granted, standby)" ], [ "ticket-group-15", "Ticket - Group (loss-policy=stop, standby, revoked)" ], [ "ticket-group-16", "Ticket - Group (loss-policy=demote, standby, granted)" ], [ "ticket-group-17", "Ticket - Group (loss-policy=demote, granted, standby)" ], [ "ticket-group-18", "Ticket - Group (loss-policy=demote, standby, revoked)" ], [ "ticket-group-19", "Ticket - Group (loss-policy=fence, standby, granted)" ], [ "ticket-group-20", "Ticket - Group (loss-policy=fence, granted, standby)" ], [ "ticket-group-21", "Ticket - Group (loss-policy=fence, standby, revoked)" ], [ "ticket-group-22", "Ticket - Group (loss-policy=freeze, standby, granted)" ], [ "ticket-group-23", "Ticket - Group (loss-policy=freeze, granted, standby)" ], [ "ticket-group-24", "Ticket - Group (loss-policy=freeze, standby, revoked)" ], ], [ [ "ticket-clone-1", "Ticket - Clone (loss-policy=stop, initial)" ], [ "ticket-clone-2", "Ticket - Clone (loss-policy=stop, granted)" ], [ "ticket-clone-3", "Ticket - Clone (loss-policy-stop, revoked)" ], [ "ticket-clone-4", "Ticket - Clone (loss-policy=demote, initial)" ], [ "ticket-clone-5", "Ticket - Clone (loss-policy=demote, granted)" ], [ "ticket-clone-6", "Ticket - Clone (loss-policy=demote, revoked)" ], [ "ticket-clone-7", "Ticket - Clone (loss-policy=fence, initial)" ], [ "ticket-clone-8", "Ticket - Clone (loss-policy=fence, granted)" ], [ "ticket-clone-9", "Ticket - Clone (loss-policy=fence, revoked)" ], [ "ticket-clone-10", "Ticket - Clone (loss-policy=freeze, initial)" ], [ "ticket-clone-11", "Ticket - Clone (loss-policy=freeze, granted)" ], [ "ticket-clone-12", "Ticket - Clone (loss-policy=freeze, revoked)" ], [ "ticket-clone-13", "Ticket - Clone (loss-policy=stop, standby, granted)" ], [ "ticket-clone-14", "Ticket - Clone (loss-policy=stop, granted, standby)" ], [ "ticket-clone-15", "Ticket - Clone (loss-policy=stop, standby, revoked)" ], [ "ticket-clone-16", "Ticket - Clone (loss-policy=demote, standby, granted)" ], [ "ticket-clone-17", "Ticket - Clone (loss-policy=demote, granted, standby)" ], [ "ticket-clone-18", "Ticket - Clone (loss-policy=demote, standby, revoked)" ], [ "ticket-clone-19", "Ticket - Clone (loss-policy=fence, standby, granted)" ], [ "ticket-clone-20", "Ticket - Clone (loss-policy=fence, granted, standby)" ], [ "ticket-clone-21", "Ticket - Clone (loss-policy=fence, standby, revoked)" ], [ "ticket-clone-22", "Ticket - Clone (loss-policy=freeze, standby, granted)" ], [ "ticket-clone-23", "Ticket - Clone (loss-policy=freeze, granted, standby)" ], [ "ticket-clone-24", "Ticket - Clone (loss-policy=freeze, standby, revoked)" ], ], [ [ "ticket-promoted-1", "Ticket - Promoted (loss-policy=stop, initial)" ], [ "ticket-promoted-2", "Ticket - Promoted (loss-policy=stop, granted)" ], [ "ticket-promoted-3", "Ticket - Promoted (loss-policy-stop, revoked)" ], [ "ticket-promoted-4", "Ticket - Promoted (loss-policy=demote, initial)" ], [ "ticket-promoted-5", "Ticket - Promoted (loss-policy=demote, granted)" ], [ "ticket-promoted-6", "Ticket - Promoted (loss-policy=demote, revoked)" ], [ "ticket-promoted-7", "Ticket - Promoted (loss-policy=fence, initial)" ], [ "ticket-promoted-8", "Ticket - Promoted (loss-policy=fence, granted)" ], [ "ticket-promoted-9", "Ticket - Promoted (loss-policy=fence, revoked)" ], [ "ticket-promoted-10", "Ticket - Promoted (loss-policy=freeze, initial)" ], [ "ticket-promoted-11", "Ticket - Promoted (loss-policy=freeze, granted)" ], [ "ticket-promoted-12", "Ticket - Promoted (loss-policy=freeze, revoked)" ], [ "ticket-promoted-13", "Ticket - Promoted (loss-policy=stop, standby, granted)" ], [ "ticket-promoted-14", "Ticket - Promoted (loss-policy=stop, granted, standby)" ], [ "ticket-promoted-15", "Ticket - Promoted (loss-policy=stop, standby, revoked)" ], [ "ticket-promoted-16", "Ticket - Promoted (loss-policy=demote, standby, granted)" ], [ "ticket-promoted-17", "Ticket - Promoted (loss-policy=demote, granted, standby)" ], [ "ticket-promoted-18", "Ticket - Promoted (loss-policy=demote, standby, revoked)" ], [ "ticket-promoted-19", "Ticket - Promoted (loss-policy=fence, standby, granted)" ], [ "ticket-promoted-20", "Ticket - Promoted (loss-policy=fence, granted, standby)" ], [ "ticket-promoted-21", "Ticket - Promoted (loss-policy=fence, standby, revoked)" ], [ "ticket-promoted-22", "Ticket - Promoted (loss-policy=freeze, standby, granted)" ], [ "ticket-promoted-23", "Ticket - Promoted (loss-policy=freeze, granted, standby)" ], [ "ticket-promoted-24", "Ticket - Promoted (loss-policy=freeze, standby, revoked)" ], ], [ [ "ticket-rsc-sets-1", "Ticket - Resource sets (1 ticket, initial)" ], [ "ticket-rsc-sets-2", "Ticket - Resource sets (1 ticket, granted)" ], [ "ticket-rsc-sets-3", "Ticket - Resource sets (1 ticket, revoked)" ], [ "ticket-rsc-sets-4", "Ticket - Resource sets (2 tickets, initial)" ], [ "ticket-rsc-sets-5", "Ticket - Resource sets (2 tickets, granted)" ], [ "ticket-rsc-sets-6", "Ticket - Resource sets (2 tickets, granted)" ], [ "ticket-rsc-sets-7", "Ticket - Resource sets (2 tickets, revoked)" ], [ "ticket-rsc-sets-8", "Ticket - Resource sets (1 ticket, standby, granted)" ], [ "ticket-rsc-sets-9", "Ticket - Resource sets (1 ticket, granted, standby)" ], [ "ticket-rsc-sets-10", "Ticket - Resource sets (1 ticket, standby, revoked)" ], [ "ticket-rsc-sets-11", "Ticket - Resource sets (2 tickets, standby, granted)" ], [ "ticket-rsc-sets-12", "Ticket - Resource sets (2 tickets, standby, granted)" ], [ "ticket-rsc-sets-13", "Ticket - Resource sets (2 tickets, granted, standby)" ], [ "ticket-rsc-sets-14", "Ticket - Resource sets (2 tickets, standby, revoked)" ], [ "cluster-specific-params", "Cluster-specific instance attributes based on rules" ], [ "site-specific-params", "Site-specific instance attributes based on rules" ], ], [ [ "template-1", "Template - 1" ], [ "template-2", "Template - 2" ], [ "template-3", "Template - 3 (merge operations)" ], [ "template-coloc-1", "Template - Colocation 1" ], [ "template-coloc-2", "Template - Colocation 2" ], [ "template-coloc-3", "Template - Colocation 3" ], [ "template-order-1", "Template - Order 1" ], [ "template-order-2", "Template - Order 2" ], [ "template-order-3", "Template - Order 3" ], [ "template-ticket", "Template - Ticket" ], [ "template-rsc-sets-1", "Template - Resource Sets 1" ], [ "template-rsc-sets-2", "Template - Resource Sets 2" ], [ "template-rsc-sets-3", "Template - Resource Sets 3" ], [ "template-rsc-sets-4", "Template - Resource Sets 4" ], [ "template-clone-primitive", "Cloned primitive from template" ], [ "template-clone-group", "Cloned group from template" ], [ "location-sets-templates", "Resource sets and templates - Location" ], [ "tags-coloc-order-1", "Tags - Colocation and Order (Simple)" ], [ "tags-coloc-order-2", "Tags - Colocation and Order (Resource Sets with Templates)" ], [ "tags-location", "Tags - Location" ], [ "tags-ticket", "Tags - Ticket" ], ], [ [ "container-1", "Container - initial" ], [ "container-2", "Container - monitor failed" ], [ "container-3", "Container - stop failed" ], [ "container-4", "Container - reached migration-threshold" ], [ "container-group-1", "Container in group - initial" ], [ "container-group-2", "Container in group - monitor failed" ], [ "container-group-3", "Container in group - stop failed" ], [ "container-group-4", "Container in group - reached migration-threshold" ], [ "container-is-remote-node", "Place resource within container when container is remote-node" ], [ "bug-rh-1097457", "Kill user defined container/contents ordering" ], [ "bug-cl-5247", "Graph loop when recovering m/s resource in a container" ], [ "bundle-order-startup", "Bundle startup ordering" ], [ "bundle-order-partial-start", "Bundle startup ordering when some dependencies are already running" ], [ "bundle-order-partial-start-2", "Bundle startup ordering when some dependencies and the container are already running" ], [ "bundle-order-stop", "Bundle stop ordering" ], [ "bundle-order-partial-stop", "Bundle startup ordering when some dependencies are already stopped" ], [ "bundle-order-stop-on-remote", "Stop nested resource after bringing up the connection" ], [ "bundle-order-startup-clone", "Prevent startup because bundle isn't promoted" ], [ "bundle-order-startup-clone-2", "Bundle startup with clones" ], [ "bundle-order-stop-clone", "Stop bundle because clone is stopping" ], [ "bundle-nested-colocation", "Colocation of nested connection resources" ], [ "bundle-order-fencing", "Order pseudo bundle fencing after parent node fencing if both are happening" ], [ "bundle-probe-order-1", "order 1" ], [ "bundle-probe-order-2", "order 2" ], [ "bundle-probe-order-3", "order 3" ], [ "bundle-probe-remotes", "Ensure remotes get probed too" ], [ "bundle-replicas-change", "Change bundle from 1 replica to multiple" ], [ "nested-remote-recovery", "Recover bundle's container hosted on remote node" ], ], [ [ "whitebox-fail1", "Fail whitebox container rsc" ], [ "whitebox-fail2", "Fail cluster connection to guest node" ], [ "whitebox-fail3", "Failed containers should not run nested on remote nodes" ], [ "whitebox-start", "Start whitebox container with resources assigned to it" ], [ "whitebox-stop", "Stop whitebox container with resources assigned to it" ], [ "whitebox-move", "Move whitebox container with resources assigned to it" ], [ "whitebox-asymmetric", "Verify connection rsc opts-in based on container resource" ], [ "whitebox-ms-ordering", "Verify promote/demote can not occur before connection is established" ], [ "whitebox-ms-ordering-move", "Stop/Start cycle within a moving container" ], [ "whitebox-orphaned", "Properly shutdown orphaned whitebox container" ], [ "whitebox-orphan-ms", "Properly tear down orphan ms resources on remote-nodes" ], [ "whitebox-unexpectedly-running", "Recover container nodes the cluster did not start" ], [ "whitebox-migrate1", "Migrate both container and connection resource" ], [ "whitebox-imply-stop-on-fence", "imply stop action on container node rsc when host node is fenced" ], [ "whitebox-nested-group", "Verify guest remote-node works nested in a group" ], [ "guest-node-host-dies", "Verify guest node is recovered if host goes away" ], [ "guest-node-cleanup", "Order guest node connection recovery after container probe" ], [ "guest-host-not-fenceable", "Actions on guest node are unrunnable if host is unclean and cannot be fenced" ], ], [ [ "remote-startup-probes", "Baremetal remote-node startup probes" ], [ "remote-startup", "Startup a newly discovered remote-nodes with no status" ], [ "remote-fence-unclean", "Fence unclean baremetal remote-node" ], [ "remote-fence-unclean2", "Fence baremetal remote-node after cluster node fails and connection can not be recovered" ], [ "remote-fence-unclean-3", "Probe failed remote nodes (triggers fencing)" ], [ "remote-move", "Move remote-node connection resource" ], [ "remote-disable", "Disable a baremetal remote-node" ], [ "remote-probe-disable", "Probe then stop a baremetal remote-node" ], [ "remote-orphaned", "Properly shutdown orphaned connection resource" ], [ "remote-orphaned2", "verify we can handle orphaned remote connections with active resources on the remote" ], [ "remote-recover", "Recover connection resource after cluster-node fails" ], [ "remote-stale-node-entry", "Make sure we properly handle leftover remote-node entries in the node section" ], [ "remote-partial-migrate", "Make sure partial migrations are handled before ops on the remote node" ], [ "remote-partial-migrate2", "Make sure partial migration target is prefered for remote connection" ], [ "remote-recover-fail", "Make sure start failure causes fencing if rsc are active on remote" ], [ "remote-start-fail", "Make sure a start failure does not result in fencing if no active resources are on remote" ], [ "remote-unclean2", "Make monitor failure always results in fencing, even if no rsc are active on remote" ], [ "remote-fence-before-reconnect", "Fence before clearing recurring monitor failure" ], [ "remote-recovery", "Recover remote connections before attempting demotion" ], [ "remote-recover-connection", "Optimistically recovery of only the connection" ], [ "remote-recover-all", "Fencing when the connection has no home" ], [ "remote-recover-no-resources", "Fencing when the connection has no home and no active resources" ], [ "remote-recover-unknown", "Fencing when the connection has no home and the remote has no operation history" ], [ "remote-reconnect-delay", "Waiting for remote reconnect interval to expire" ], [ "remote-connection-unrecoverable", "Remote connection host must be fenced, with connection unrecoverable" ], + [ "remote-connection-shutdown", "Remote connection shutdown" ], [ "cancel-behind-moving-remote", "Route recurring monitor cancellations through original node of a moving remote connection" ], ], [ [ "resource-discovery", "Exercises resource-discovery location constraint option" ], [ "rsc-discovery-per-node", "Disable resource discovery per node" ], [ "shutdown-lock", "Ensure shutdown lock works properly" ], [ "shutdown-lock-expiration", "Ensure shutdown lock expiration works properly" ], ], [ [ "op-defaults", "Test op_defaults conditional expressions" ], [ "op-defaults-2", "Test op_defaults AND'ed conditional expressions" ], [ "op-defaults-3", "Test op_defaults precedence" ], [ "rsc-defaults", "Test rsc_defaults conditional expressions" ], [ "rsc-defaults-2", "Test rsc_defaults conditional expressions without type" ], ], [ [ "stop-all-resources", "Test stop-all-resources=true "], ], [ [ "ocf_degraded-remap-ocf_ok", "Test degraded remapped to OK" ], [ "ocf_degraded_promoted-remap-ocf_ok", "Test degraded promoted remapped to OK"], ], # @TODO: If pacemaker implements versioned attributes, uncomment these tests #[ # [ "versioned-resources", "Start resources with #ra-version rules" ], # [ "restart-versioned", "Restart resources on #ra-version change" ], # [ "reload-versioned", "Reload resources on #ra-version change" ], #], #[ # [ "versioned-operations-1", "Use #ra-version to configure operations of native resources" ], # [ "versioned-operations-2", "Use #ra-version to configure operations of stonith resources" ], # [ "versioned-operations-3", "Use #ra-version to configure operations of promotable resources" ], # [ "versioned-operations-4", "Use #ra-version to configure operations of groups of the resources" ], #], ] TESTS_64BIT = [ [ [ "year-2038", "Check handling of timestamps beyond 2038-01-19 03:14:08 UTC" ], ], ] # Constants substituted in the build process class BuildVars(object): SBINDIR = "@sbindir@" BUILDDIR = "@abs_top_builddir@" CRM_SCHEMA_DIRECTORY = "@CRM_SCHEMA_DIRECTORY@" # These values must be kept in sync with crm_exit_t class CrmExit(object): OK = 0 ERROR = 1 NOT_INSTALLED = 5 NOINPUT = 66 CANTCREAT = 73 def is_executable(path): """ Check whether a file at a given path is executable. """ try: return os.stat(path)[stat.ST_MODE] & stat.S_IXUSR except OSError: return False def diff(file1, file2, **kwargs): """ Call diff on two files """ return subprocess.call([ "diff", "-u", "-N", "--ignore-all-space", "--ignore-blank-lines", file1, file2 ], **kwargs) def sort_file(filename): """ Sort a file alphabetically """ with io.open(filename, "rt") as f: lines = sorted(f) with io.open(filename, "wt") as f: f.writelines(lines) def remove_files(filenames): """ Remove a list of files """ for filename in filenames: try: os.remove(filename) except OSError: pass def normalize(filename): """ Remove text from a file that isn't important for comparison """ if not hasattr(normalize, "patterns"): normalize.patterns = [ re.compile(r'crm_feature_set="[^"]*"'), re.compile(r'batch-limit="[0-9]*"') ] if os.path.isfile(filename): with io.open(filename, "rt") as f: lines = f.readlines() with io.open(filename, "wt") as f: for line in lines: for pattern in normalize.patterns: line = pattern.sub("", line) f.write(line) def cat(filename, dest=sys.stdout): """ Copy a file to a destination file descriptor """ with io.open(filename, "rt") as f: shutil.copyfileobj(f, dest) class CtsScheduler(object): """ Regression tests for Pacemaker's scheduler """ def _parse_args(self, argv): """ Parse command-line arguments """ parser = argparse.ArgumentParser(description=DESC) parser.add_argument('-V', '--verbose', action='count', help='Display any differences from expected output') parser.add_argument('--run', metavar='TEST', help=('Run only single specified test (any further ' 'arguments will be passed to crm_simulate)')) parser.add_argument('--update', action='store_true', help='Update expected results with actual results') parser.add_argument('-b', '--binary', metavar='PATH', help='Specify path to crm_simulate') parser.add_argument('-i', '--io-dir', metavar='PATH', help='Specify path to regression test data directory') parser.add_argument('-o', '--out-dir', metavar='PATH', help='Specify where intermediate and output files should go') parser.add_argument('-v', '--valgrind', action='store_true', help='Run all commands under valgrind') parser.add_argument('--valgrind-dhat', action='store_true', help='Run all commands under valgrind with heap analyzer') parser.add_argument('--valgrind-skip-output', action='store_true', help='If running under valgrind, do not display output') parser.add_argument('--testcmd-options', metavar='OPTIONS', default='', help='Additional options for command under test') # argparse can't handle "everything after --run TEST", so grab that self.single_test_args = [] narg = 0 for arg in argv: narg = narg + 1 if arg == '--run': (argv, self.single_test_args) = (argv[:narg+1], argv[narg+1:]) break self.args = parser.parse_args(argv[1:]) def _error(self, s): print(" * ERROR: %s" % s) def _failed(self, s): print(" * FAILED: %s" % s) def _get_valgrind_cmd(self): """ Return command arguments needed (or not) to run valgrind """ if self.args.valgrind: os.environ['G_SLICE'] = "always-malloc" return [ "valgrind", "-q", "--gen-suppressions=all", "--time-stamp=yes", "--trace-children=no", "--show-reachable=no", "--leak-check=full", "--num-callers=20", "--suppressions=%s/valgrind-pcmk.suppressions" % (self.test_home) ] if self.args.valgrind_dhat: os.environ['G_SLICE'] = "always-malloc" return [ "valgrind", "--tool=exp-dhat", "--time-stamp=yes", "--trace-children=no", "--show-top-n=100", "--num-callers=4" ] return [] def _get_simulator_cmd(self): """ Locate the simulation binary """ if self.args.binary is None: self.args.binary = BuildVars.BUILDDIR + "/tools/crm_simulate" if not is_executable(self.args.binary): self.args.binary = BuildVars.SBINDIR + "/crm_simulate" if not is_executable(self.args.binary): # @TODO it would be more pythonic to raise an exception self._error("Test binary " + self.args.binary + " not found") sys.exit(CrmExit.NOT_INSTALLED) return [ self.args.binary ] + shlex.split(self.args.testcmd_options) def set_schema_env(self): """ Ensure schema directory environment variable is set, if possible """ try: return os.environ['PCMK_schema_directory'] except KeyError: for d in [ os.path.join(BuildVars.BUILDDIR, "xml"), BuildVars.CRM_SCHEMA_DIRECTORY ]: if os.path.isdir(d): os.environ['PCMK_schema_directory'] = d return d return None def __init__(self, argv=sys.argv): # Ensure all command output is in portable locale for comparison os.environ['LC_ALL'] = "C" self._parse_args(argv) # Where this executable lives self.test_home = os.path.dirname(os.path.realpath(argv[0])) # Where test data resides if self.args.io_dir is None: self.args.io_dir = os.path.join(self.test_home, "scheduler") self.xml_input_dir = os.path.join(self.args.io_dir, "xml") self.expected_dir = os.path.join(self.args.io_dir, "exp") self.dot_expected_dir = os.path.join(self.args.io_dir, "dot") self.scores_dir = os.path.join(self.args.io_dir, "scores") self.summary_dir = os.path.join(self.args.io_dir, "summary") self.stderr_expected_dir = os.path.join(self.args.io_dir, "stderr") # Create a temporary directory to store diff file self.failed_dir = tempfile.mkdtemp(prefix='cts-scheduler_') # Where to store generated files if self.args.out_dir is None: self.args.out_dir = self.args.io_dir self.failed_filename = os.path.join(self.failed_dir, "test-output.diff") else: self.failed_filename = os.path.join(self.args.out_dir, "test-output.diff") os.environ['CIB_shadow_dir'] = self.args.out_dir self.failed_file = None self.outfile_out_dir = os.path.join(self.args.out_dir, "out") self.dot_out_dir = os.path.join(self.args.out_dir, "dot") self.scores_out_dir = os.path.join(self.args.out_dir, "scores") self.summary_out_dir = os.path.join(self.args.out_dir, "summary") self.stderr_out_dir = os.path.join(self.args.out_dir, "stderr") self.valgrind_out_dir = os.path.join(self.args.out_dir, "valgrind") # Single test mode (if requested) try: # User can give test base name or file name of a test input self.args.run = os.path.splitext(os.path.basename(self.args.run))[0] except (AttributeError, TypeError): pass # --run was not specified self.set_schema_env() # Arguments needed (or not) to run commands self.valgrind_args = self._get_valgrind_cmd() self.simulate_args = self._get_simulator_cmd() # Test counters self.num_failed = 0 self.num_tests = 0 # Ensure that the main output directory exists # We don't want to create it with os.makedirs below if not os.path.isdir(self.args.out_dir): self._error("Output directory missing; can't create output files") sys.exit(CrmExit.CANTCREAT) # Create output subdirectories if they don't exist try: os.makedirs(self.outfile_out_dir, 0o755, True) os.makedirs(self.dot_out_dir, 0o755, True) os.makedirs(self.scores_out_dir, 0o755, True) os.makedirs(self.summary_out_dir, 0o755, True) os.makedirs(self.stderr_out_dir, 0o755, True) if self.valgrind_args: os.makedirs(self.valgrind_out_dir, 0o755, True) except OSError as ex: self._error("Unable to create output subdirectory: %s" % ex) remove_files([ self.outfile_out_dir, self.dot_out_dir, self.scores_out_dir, self.summary_out_dir, self.stderr_out_dir, ]) sys.exit(CrmExit.CANTCREAT) def _compare_files(self, filename1, filename2): """ Add any file differences to failed results """ if diff(filename1, filename2, stdout=subprocess.DEVNULL) != 0: diff(filename1, filename2, stdout=self.failed_file, stderr=subprocess.DEVNULL) self.failed_file.write("\n") return True return False def run_one(self, test_name, test_desc, test_args=[]): """ Run one scheduler test """ print(" Test %-25s %s" % ((test_name + ":"), test_desc)) did_fail = False self.num_tests = self.num_tests + 1 # Test inputs input_filename = os.path.join( self.xml_input_dir, "%s.xml" % test_name) expected_filename = os.path.join( self.expected_dir, "%s.exp" % test_name) dot_expected_filename = os.path.join( self.dot_expected_dir, "%s.dot" % test_name) scores_filename = os.path.join( self.scores_dir, "%s.scores" % test_name) summary_filename = os.path.join( self.summary_dir, "%s.summary" % test_name) stderr_expected_filename = os.path.join( self.stderr_expected_dir, "%s.stderr" % test_name) # (Intermediate) test outputs output_filename = os.path.join( self.outfile_out_dir, "%s.out" % test_name) dot_output_filename = os.path.join( self.dot_out_dir, "%s.dot.pe" % test_name) score_output_filename = os.path.join( self.scores_out_dir, "%s.scores.pe" % test_name) summary_output_filename = os.path.join( self.summary_out_dir, "%s.summary.pe" % test_name) stderr_output_filename = os.path.join( self.stderr_out_dir, "%s.stderr.pe" % test_name) valgrind_output_filename = os.path.join( self.valgrind_out_dir, "%s.valgrind" % test_name) # Common arguments for running test test_cmd = [] if self.valgrind_args: test_cmd = self.valgrind_args + [ "--log-file=%s" % valgrind_output_filename ] test_cmd = test_cmd + self.simulate_args # @TODO It would be more pythonic to raise exceptions for errors, # then perhaps it would be nice to make a single-test class # Ensure necessary test inputs exist if not os.path.isfile(input_filename): self._error("No input") self.num_failed = self.num_failed + 1 return CrmExit.NOINPUT if not self.args.update and not os.path.isfile(expected_filename): self._error("no stored output") return CrmExit.NOINPUT # Run simulation to generate summary output if self.args.run: # Single test mode test_cmd_full = test_cmd + [ '-x', input_filename, '-S' ] + test_args print(" ".join(test_cmd_full)) else: # @TODO Why isn't test_args added here? test_cmd_full = test_cmd + [ '-x', input_filename, '-S' ] with io.open(summary_output_filename, "wt") as f: simulation = subprocess.Popen(test_cmd_full, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=os.environ) # This makes diff happy regardless of --enable-compat-2.0. # Use sed -E to make Linux and BSD special characters more compatible. sed = subprocess.Popen(["sed", "-E", "-e", "s/ocf::/ocf:/g", "-e", r"s/Masters:/Promoted:/", "-e", r"s/Slaves:/Unpromoted:/", "-e", r"s/ Master( |\[|$)/ Promoted\1/", "-e", r"s/ Slave / Unpromoted /", ], stdin=simulation.stdout, stdout=f, stderr=subprocess.STDOUT) simulation.stdout.close() sed.communicate() if self.args.run: cat(summary_output_filename) # Re-run simulation to generate dot, graph, and scores test_cmd_full = test_cmd + [ '-x', input_filename, '-D', dot_output_filename, '-G', output_filename, '-sSQ' ] + test_args with io.open(stderr_output_filename, "wt") as f_stderr, \ io.open(score_output_filename, "wt") as f_score: rc = subprocess.call(test_cmd_full, stdout=f_score, stderr=f_stderr, env=os.environ) # Check for test command failure if rc != CrmExit.OK: self._failed("Test returned: %d" % rc) did_fail = True print(" ".join(test_cmd_full)) # Check for valgrind errors if self.valgrind_args and not self.args.valgrind_skip_output: if os.stat(valgrind_output_filename).st_size > 0: self._failed("Valgrind reported errors") did_fail = True cat(valgrind_output_filename) remove_files([ valgrind_output_filename ]) # Check for core dump if os.path.isfile("core"): self._failed("Core-file detected: core." + test_name) did_fail = True os.rename("core", "%s/core.%s" % (self.test_home, test_name)) # Check any stderr output if os.path.isfile(stderr_expected_filename): if self._compare_files(stderr_expected_filename, stderr_output_filename): self._failed("stderr changed") did_fail = True elif os.stat(stderr_output_filename).st_size > 0: self._failed("Output was written to stderr") did_fail = True cat(stderr_output_filename) remove_files([ stderr_output_filename ]) # Check whether output graph exists, and normalize it if (not os.path.isfile(output_filename) or os.stat(output_filename).st_size == 0): self._error("No graph produced") did_fail = True self.num_failed = self.num_failed + 1 remove_files([ output_filename ]) return CrmExit.ERROR normalize(output_filename) # Check whether dot output exists, and sort it if (not os.path.isfile(dot_output_filename) or os.stat(dot_output_filename).st_size == 0): self._error("No dot-file summary produced") did_fail = True self.num_failed = self.num_failed + 1 remove_files([ dot_output_filename, output_filename ]) return CrmExit.ERROR with io.open(dot_output_filename, "rt") as f: first_line = f.readline() # "digraph" line with opening brace lines = f.readlines() last_line = lines[-1] # closing brace del lines[-1] lines = sorted(set(lines)) # unique sort with io.open(dot_output_filename, "wt") as f: f.write(first_line) f.writelines(lines) f.write(last_line) # Check whether score output exists, and sort it if (not os.path.isfile(score_output_filename) or os.stat(score_output_filename).st_size == 0): self._error("No allocation scores produced") did_fail = True self.num_failed = self.num_failed + 1 remove_files([ score_output_filename, output_filename ]) return CrmExit.ERROR else: sort_file(score_output_filename) if self.args.update: shutil.copyfile(output_filename, expected_filename) shutil.copyfile(dot_output_filename, dot_expected_filename) shutil.copyfile(score_output_filename, scores_filename) shutil.copyfile(summary_output_filename, summary_filename) print(" Updated expected outputs") if self._compare_files(summary_filename, summary_output_filename): self._failed("summary changed") did_fail = True if self._compare_files(dot_expected_filename, dot_output_filename): self._failed("dot-file summary changed") did_fail = True else: remove_files([ dot_output_filename ]) if self._compare_files(expected_filename, output_filename): self._failed("xml-file changed") did_fail = True if self._compare_files(scores_filename, score_output_filename): self._failed("scores-file changed") did_fail = True remove_files([ output_filename, score_output_filename, summary_output_filename]) if did_fail: self.num_failed = self.num_failed + 1 return CrmExit.ERROR return CrmExit.OK def run_all(self): """ Run all defined tests """ if platform.architecture()[0] == "64bit": TESTS.extend(TESTS_64BIT) for group in TESTS: for test in group: try: args = test[2] except IndexError: args = [] self.run_one(test[0], test[1], args) print() def _print_summary(self): """ Print a summary of parameters for this test run """ print("Test home is:\t" + self.test_home) print("Test binary is:\t" + self.args.binary) if 'PCMK_schema_directory' in os.environ: print("Schema home is:\t" + os.environ['PCMK_schema_directory']) if self.valgrind_args != []: print("Activating memory testing with valgrind") print() def _test_results(self): if self.num_failed == 0: shutil.rmtree(self.failed_dir) return CrmExit.OK if os.path.isfile(self.failed_filename) and os.stat(self.failed_filename).st_size != 0: if self.args.verbose: self._error("Results of %d failed tests (out of %d):" % (self.num_failed, self.num_tests)) cat(self.failed_filename) else: self._error("Results of %d failed tests (out of %d) are in %s" % (self.num_failed, self.num_tests, self.failed_filename)) self._error("Use -V to display them after running the tests") else: self._error("%d (of %d) tests failed (no diff results)" % (self.num_failed, self.num_tests)) if os.path.isfile(self.failed_filename): shutil.rmtree(self.failed_dir) return CrmExit.ERROR def run(self): """ Run test(s) as specified """ self._print_summary() # Zero out the error log self.failed_file = io.open(self.failed_filename, "wt") if self.args.run is None: print("Performing the following tests from " + self.args.io_dir) print() self.run_all() print() self.failed_file.close() rc = self._test_results() else: rc = self.run_one(self.args.run, "Single shot", self.single_test_args) self.failed_file.close() if self.num_failed > 0: print("\nFailures:\nThese have also been written to: " + self.failed_filename + "\n") cat(self.failed_filename) shutil.rmtree(self.failed_dir) return rc if __name__ == "__main__": sys.exit(CtsScheduler().run()) # vim: set filetype=python expandtab tabstop=4 softtabstop=4 shiftwidth=4 textwidth=120: diff --git a/cts/scheduler/scores/bug-5059.scores b/cts/scheduler/scores/bug-5059.scores index 7c447f9158..5352affab2 100644 --- a/cts/scheduler/scores/bug-5059.scores +++ b/cts/scheduler/scores/bug-5059.scores @@ -1,92 +1,92 @@ -g_stateful:0 promotion score on gluster01.h: 4 -g_stateful:1 promotion score on gluster02.h: 4 +g_stateful:0 promotion score on gluster01.h: 5 +g_stateful:1 promotion score on gluster02.h: 5 g_stateful:2 promotion score on none: 0 pcmk__clone_allocate: c_dummy allocation score on gluster01.h: 0 pcmk__clone_allocate: c_dummy allocation score on gluster02.h: 0 pcmk__clone_allocate: c_dummy allocation score on gluster03.h: 0 pcmk__clone_allocate: c_dummy allocation score on gluster04.h: 0 pcmk__clone_allocate: g_stateful:0 allocation score on gluster01.h: 5 pcmk__clone_allocate: g_stateful:0 allocation score on gluster02.h: 0 pcmk__clone_allocate: g_stateful:0 allocation score on gluster03.h: 0 pcmk__clone_allocate: g_stateful:0 allocation score on gluster04.h: 0 pcmk__clone_allocate: g_stateful:1 allocation score on gluster01.h: 0 pcmk__clone_allocate: g_stateful:1 allocation score on gluster02.h: 5 pcmk__clone_allocate: g_stateful:1 allocation score on gluster03.h: 0 pcmk__clone_allocate: g_stateful:1 allocation score on gluster04.h: 0 pcmk__clone_allocate: ms_stateful allocation score on gluster01.h: 0 pcmk__clone_allocate: ms_stateful allocation score on gluster02.h: 0 pcmk__clone_allocate: ms_stateful allocation score on gluster03.h: 0 pcmk__clone_allocate: ms_stateful allocation score on gluster04.h: 0 pcmk__clone_allocate: p_dummy1:0 allocation score on gluster01.h: 1 pcmk__clone_allocate: p_dummy1:0 allocation score on gluster02.h: 0 pcmk__clone_allocate: p_dummy1:0 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_dummy1:0 allocation score on gluster04.h: 0 pcmk__clone_allocate: p_dummy1:1 allocation score on gluster01.h: 0 pcmk__clone_allocate: p_dummy1:1 allocation score on gluster02.h: 1 pcmk__clone_allocate: p_dummy1:1 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_dummy1:1 allocation score on gluster04.h: 0 pcmk__clone_allocate: p_stateful1:0 allocation score on gluster01.h: 1 pcmk__clone_allocate: p_stateful1:0 allocation score on gluster02.h: 0 pcmk__clone_allocate: p_stateful1:0 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_stateful1:0 allocation score on gluster04.h: 0 pcmk__clone_allocate: p_stateful1:1 allocation score on gluster01.h: 0 pcmk__clone_allocate: p_stateful1:1 allocation score on gluster02.h: 1 pcmk__clone_allocate: p_stateful1:1 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_stateful1:1 allocation score on gluster04.h: 0 pcmk__clone_allocate: p_stateful2:0 allocation score on gluster01.h: 0 pcmk__clone_allocate: p_stateful2:0 allocation score on gluster02.h: 0 pcmk__clone_allocate: p_stateful2:0 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_stateful2:0 allocation score on gluster04.h: 0 pcmk__clone_allocate: p_stateful2:1 allocation score on gluster01.h: 0 pcmk__clone_allocate: p_stateful2:1 allocation score on gluster02.h: 0 pcmk__clone_allocate: p_stateful2:1 allocation score on gluster03.h: 0 pcmk__clone_allocate: p_stateful2:1 allocation score on gluster04.h: 0 pcmk__group_allocate: g_stateful:0 allocation score on gluster01.h: 5 pcmk__group_allocate: g_stateful:0 allocation score on gluster02.h: 0 pcmk__group_allocate: g_stateful:0 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: g_stateful:0 allocation score on gluster04.h: -INFINITY pcmk__group_allocate: g_stateful:1 allocation score on gluster01.h: -INFINITY pcmk__group_allocate: g_stateful:1 allocation score on gluster02.h: 5 pcmk__group_allocate: g_stateful:1 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: g_stateful:1 allocation score on gluster04.h: -INFINITY pcmk__group_allocate: p_stateful1:0 allocation score on gluster01.h: 1 pcmk__group_allocate: p_stateful1:0 allocation score on gluster02.h: 0 pcmk__group_allocate: p_stateful1:0 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: p_stateful1:0 allocation score on gluster04.h: -INFINITY pcmk__group_allocate: p_stateful1:1 allocation score on gluster01.h: -INFINITY pcmk__group_allocate: p_stateful1:1 allocation score on gluster02.h: 1 pcmk__group_allocate: p_stateful1:1 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: p_stateful1:1 allocation score on gluster04.h: -INFINITY pcmk__group_allocate: p_stateful2:0 allocation score on gluster01.h: 0 pcmk__group_allocate: p_stateful2:0 allocation score on gluster02.h: 0 pcmk__group_allocate: p_stateful2:0 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: p_stateful2:0 allocation score on gluster04.h: -INFINITY pcmk__group_allocate: p_stateful2:1 allocation score on gluster01.h: -INFINITY pcmk__group_allocate: p_stateful2:1 allocation score on gluster02.h: 0 pcmk__group_allocate: p_stateful2:1 allocation score on gluster03.h: -INFINITY pcmk__group_allocate: p_stateful2:1 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_dummy1:0 allocation score on gluster01.h: 1 pcmk__native_allocate: p_dummy1:0 allocation score on gluster02.h: 0 pcmk__native_allocate: p_dummy1:0 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_dummy1:0 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_dummy1:1 allocation score on gluster01.h: -INFINITY pcmk__native_allocate: p_dummy1:1 allocation score on gluster02.h: 1 pcmk__native_allocate: p_dummy1:1 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_dummy1:1 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_stateful1:0 allocation score on gluster01.h: 1 pcmk__native_allocate: p_stateful1:0 allocation score on gluster02.h: 0 pcmk__native_allocate: p_stateful1:0 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_stateful1:0 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_stateful1:1 allocation score on gluster01.h: -INFINITY pcmk__native_allocate: p_stateful1:1 allocation score on gluster02.h: 1 pcmk__native_allocate: p_stateful1:1 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_stateful1:1 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_stateful2:0 allocation score on gluster01.h: 0 pcmk__native_allocate: p_stateful2:0 allocation score on gluster02.h: -INFINITY pcmk__native_allocate: p_stateful2:0 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_stateful2:0 allocation score on gluster04.h: -INFINITY pcmk__native_allocate: p_stateful2:1 allocation score on gluster01.h: -INFINITY pcmk__native_allocate: p_stateful2:1 allocation score on gluster02.h: 0 pcmk__native_allocate: p_stateful2:1 allocation score on gluster03.h: -INFINITY pcmk__native_allocate: p_stateful2:1 allocation score on gluster04.h: -INFINITY diff --git a/cts/scheduler/scores/remote-connection-shutdown.scores b/cts/scheduler/scores/remote-connection-shutdown.scores index 003b067701..e9536d1675 100644 --- a/cts/scheduler/scores/remote-connection-shutdown.scores +++ b/cts/scheduler/scores/remote-connection-shutdown.scores @@ -1,2560 +1,2533 @@ -Allocation scores: -Only 'private' parameters to nova-evacuate_monitor_10000 on database-0 changed: 0:0;259:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to nova-evacuate_start_0 on database-0 changed: 0:0;258:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-0 changed -Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-1 changed -Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_monitor_60000 on database-2 changed: 0:0;265:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_start_0 on database-2 changed: 0:0;263:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_monitor_60000 on database-1 changed: 0:0;263:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_start_0 on database-1 changed: 0:0;261:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_monitor_60000 on messaging-0 changed: 0:0;269:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_start_0 on messaging-0 changed: 0:0;267:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400642894_monitor_60000 on messaging-2 changed: 0:0;274:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400642894_start_0 on messaging-2 changed: 0:0;272:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_monitor_60000 on messaging-1 changed: 0:0;273:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_start_0 on messaging-1 changed: 0:0;271:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_monitor_60000 on database-0 changed: 0:0;323:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_start_0 on database-0 changed: 0:0;322:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_monitor_60000 on messaging-0 changed: 0:0;325:70:0:40f880e4-b328-4380-9703-47856390a1e0 -Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_start_0 on messaging-0 changed: 0:0;324:70:0:40f880e4-b328-4380-9703-47856390a1e0 -Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_monitor_60000 on database-2 changed: 0:0;320:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_start_0 on database-2 changed: 0:0;319:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_monitor_60000 on database-1 changed: 0:0;331:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_start_0 on database-1 changed: 0:0;330:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400e10267_monitor_60000 on messaging-1 changed: 0:0;326:1318:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400e10267_start_0 on messaging-1 changed: 0:0;320:1317:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_monitor_60000 on messaging-2 changed: 0:0;323:50:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_start_0 on messaging-2 changed: 0:0;321:49:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Using the original execution date of: 2020-11-17 07:03:16Z + galera:0 promotion score on galera-bundle-0: 100 galera:1 promotion score on galera-bundle-1: 100 galera:2 promotion score on galera-bundle-2: 100 ovndb_servers:0 promotion score on ovn-dbs-bundle-0: 10 ovndb_servers:1 promotion score on ovn-dbs-bundle-1: 5 ovndb_servers:2 promotion score on ovn-dbs-bundle-2: 5 pcmk__bundle_allocate: galera-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on controller-0: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on controller-1: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on controller-2: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: galera-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: galera-bundle-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-0: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-1: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on controller-2: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: galera-bundle-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-0: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-1: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on controller-2: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: galera-bundle-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-0: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-1: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on controller-2: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: galera-bundle-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on compute-0: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on compute-1: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on controller-0: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on controller-1: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on controller-2: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-0: -INFINITY pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-1: -INFINITY pcmk__bundle_allocate: galera-bundle-master allocation score on galera-bundle-2: -INFINITY pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-0: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-1: 0 pcmk__bundle_allocate: galera-bundle-master allocation score on messaging-2: 0 pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-0: 0 pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-1: 0 pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on database-2: 0 pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: galera-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: galera:0 allocation score on galera-bundle-0: 501 pcmk__bundle_allocate: galera:1 allocation score on galera-bundle-1: 501 pcmk__bundle_allocate: galera:2 allocation score on galera-bundle-2: 501 pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-0: 0 pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: 0 pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on controller-2: 0 pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on compute-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on compute-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-0: 0 pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-1: 0 pcmk__bundle_allocate: openstack-cinder-volume allocation score on controller-2: 0 pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on database-2: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-0: 0 pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-1: 0 pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on controller-2: 0 pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 10000 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 10000 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 10000 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on compute-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on database-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on messaging-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: 10 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: 5 pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: 5 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: 0 pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: 501 pcmk__bundle_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY pcmk__bundle_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: 501 pcmk__bundle_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY pcmk__bundle_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: 501 pcmk__bundle_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on controller-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on controller-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on database-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on controller-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on database-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on controller-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on database-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on compute-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on compute-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on controller-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on database-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: 501 pcmk__bundle_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: 501 pcmk__bundle_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: 501 pcmk__bundle_allocate: redis-bundle allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle allocation score on database-0: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on database-1: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on database-2: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: redis-bundle allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: redis-bundle-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on database-0: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on database-1: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on database-2: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-0: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-1: 0 pcmk__bundle_allocate: redis-bundle-0 allocation score on messaging-2: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on database-0: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on database-1: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on database-2: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-0: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-1: 0 pcmk__bundle_allocate: redis-bundle-1 allocation score on messaging-2: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on database-0: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on database-1: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on database-2: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-0: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-1: 0 pcmk__bundle_allocate: redis-bundle-2 allocation score on messaging-2: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on compute-0: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on compute-1: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on database-0: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on database-1: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on database-2: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-0: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-1: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on messaging-2: 0 pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-0: -INFINITY pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-1: -INFINITY pcmk__bundle_allocate: redis-bundle-master allocation score on redis-bundle-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-0: 0 pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-1: 0 pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on controller-2: 0 pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__bundle_allocate: redis-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__bundle_allocate: redis:0 allocation score on redis-bundle-0: 501 pcmk__bundle_allocate: redis:1 allocation score on redis-bundle-1: 501 pcmk__bundle_allocate: redis:2 allocation score on redis-bundle-2: 501 pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger-clone allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on compute-0: 1 pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on compute-1: 1 pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on compute-0: 0 pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on compute-1: 0 pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on controller-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on database-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on messaging-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-0: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-1: -INFINITY pcmk__clone_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-2: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on compute-0: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on compute-1: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on controller-0: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on controller-1: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on controller-2: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on database-0: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on database-1: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on database-2: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-0: 0 pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-1: 0 pcmk__clone_allocate: galera-bundle-master allocation score on galera-bundle-2: 0 pcmk__clone_allocate: galera-bundle-master allocation score on messaging-0: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on messaging-1: -INFINITY pcmk__clone_allocate: galera-bundle-master allocation score on messaging-2: -INFINITY pcmk__clone_allocate: galera:0 allocation score on galera-bundle-0: INFINITY pcmk__clone_allocate: galera:1 allocation score on galera-bundle-1: INFINITY pcmk__clone_allocate: galera:2 allocation score on galera-bundle-2: INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on compute-0: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on compute-1: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-0: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-1: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on controller-2: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-0: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-1: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on database-2: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-0: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-1: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on messaging-2: -INFINITY pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-0: 0 pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-1: 0 pcmk__clone_allocate: ovn-dbs-bundle-master allocation score on ovn-dbs-bundle-2: 0 pcmk__clone_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY pcmk__clone_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY pcmk__clone_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on compute-0: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on compute-1: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-0: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-1: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on controller-2: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-0: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-1: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on database-2: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-0: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-1: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on messaging-2: -INFINITY pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-0: 0 pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-1: 0 pcmk__clone_allocate: rabbitmq-bundle-clone allocation score on rabbitmq-bundle-2: 0 pcmk__clone_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY pcmk__clone_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY pcmk__clone_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on compute-0: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on compute-1: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on controller-0: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on controller-1: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on controller-2: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on database-0: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on database-1: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on database-2: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on messaging-0: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on messaging-1: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on messaging-2: -INFINITY pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-0: 0 pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-1: 0 pcmk__clone_allocate: redis-bundle-master allocation score on redis-bundle-2: 0 pcmk__clone_allocate: redis:0 allocation score on redis-bundle-0: INFINITY pcmk__clone_allocate: redis:1 allocation score on redis-bundle-1: INFINITY pcmk__clone_allocate: redis:2 allocation score on redis-bundle-2: INFINITY pcmk__native_allocate: compute-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-0 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-0 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-0 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-1 allocation score on controller-0: 0 pcmk__native_allocate: compute-1 allocation score on controller-1: 0 pcmk__native_allocate: compute-1 allocation score on controller-2: 0 pcmk__native_allocate: compute-1 allocation score on database-0: 0 pcmk__native_allocate: compute-1 allocation score on database-1: 0 pcmk__native_allocate: compute-1 allocation score on database-2: 0 pcmk__native_allocate: compute-1 allocation score on messaging-0: 0 pcmk__native_allocate: compute-1 allocation score on messaging-1: 0 pcmk__native_allocate: compute-1 allocation score on messaging-2: 0 pcmk__native_allocate: compute-unfence-trigger:0 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:0 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on compute-1: 1 pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:1 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:10 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:11 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:12 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:13 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:14 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:15 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:16 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:17 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:18 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:19 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:2 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:20 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:21 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:22 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:3 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:4 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:5 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:6 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:7 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:8 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on compute-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on compute-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on controller-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on database-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on galera-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on messaging-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on ovn-dbs-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on rabbitmq-bundle-2: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-0: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-1: -INFINITY pcmk__native_allocate: compute-unfence-trigger:9 allocation score on redis-bundle-2: -INFINITY pcmk__native_allocate: galera-bundle-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-0 allocation score on controller-0: 0 pcmk__native_allocate: galera-bundle-0 allocation score on controller-1: 0 pcmk__native_allocate: galera-bundle-0 allocation score on controller-2: 0 pcmk__native_allocate: galera-bundle-0 allocation score on database-0: 10000 pcmk__native_allocate: galera-bundle-0 allocation score on database-1: 0 pcmk__native_allocate: galera-bundle-0 allocation score on database-2: 0 pcmk__native_allocate: galera-bundle-0 allocation score on messaging-0: 0 pcmk__native_allocate: galera-bundle-0 allocation score on messaging-1: 0 pcmk__native_allocate: galera-bundle-0 allocation score on messaging-2: 0 pcmk__native_allocate: galera-bundle-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-1 allocation score on controller-0: 0 pcmk__native_allocate: galera-bundle-1 allocation score on controller-1: 0 pcmk__native_allocate: galera-bundle-1 allocation score on controller-2: 0 pcmk__native_allocate: galera-bundle-1 allocation score on database-0: 0 pcmk__native_allocate: galera-bundle-1 allocation score on database-1: 10000 pcmk__native_allocate: galera-bundle-1 allocation score on database-2: 0 pcmk__native_allocate: galera-bundle-1 allocation score on messaging-0: 0 pcmk__native_allocate: galera-bundle-1 allocation score on messaging-1: 0 pcmk__native_allocate: galera-bundle-1 allocation score on messaging-2: 0 pcmk__native_allocate: galera-bundle-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-2 allocation score on controller-0: 0 pcmk__native_allocate: galera-bundle-2 allocation score on controller-1: 0 pcmk__native_allocate: galera-bundle-2 allocation score on controller-2: 0 pcmk__native_allocate: galera-bundle-2 allocation score on database-0: 0 pcmk__native_allocate: galera-bundle-2 allocation score on database-1: 0 pcmk__native_allocate: galera-bundle-2 allocation score on database-2: 10000 pcmk__native_allocate: galera-bundle-2 allocation score on messaging-0: 0 pcmk__native_allocate: galera-bundle-2 allocation score on messaging-1: 0 pcmk__native_allocate: galera-bundle-2 allocation score on messaging-2: 0 pcmk__native_allocate: galera-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on controller-2: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-0: 0 pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-1: 0 pcmk__native_allocate: galera-bundle-podman-0 allocation score on database-2: 0 pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-1: 0 pcmk__native_allocate: galera-bundle-podman-1 allocation score on database-2: 0 pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on database-2: 0 pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: galera-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__native_allocate: galera:0 allocation score on galera-bundle-0: INFINITY pcmk__native_allocate: galera:1 allocation score on galera-bundle-1: INFINITY pcmk__native_allocate: galera:2 allocation score on galera-bundle-2: INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-0: INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-1: INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-0: INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-1: INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-1: INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: haproxy-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-0: INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-1: 0 pcmk__native_allocate: ip-10.0.0.150 allocation score on controller-2: 0 pcmk__native_allocate: ip-10.0.0.150 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-10.0.0.150 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-0: 0 pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-1: 0 pcmk__native_allocate: ip-172.17.1.150 allocation score on controller-2: INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-172.17.1.150 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-0: 0 pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-1: INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on controller-2: 0 pcmk__native_allocate: ip-172.17.1.151 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-172.17.1.151 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-0: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-1: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on controller-2: INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-172.17.1.57 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-0: INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-1: 0 pcmk__native_allocate: ip-172.17.3.150 allocation score on controller-2: 0 pcmk__native_allocate: ip-172.17.3.150 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-172.17.3.150 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-0: 0 pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-1: INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on controller-2: 0 pcmk__native_allocate: ip-172.17.4.150 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-172.17.4.150 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on compute-0: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on compute-1: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-0: 0 pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-1: 0 pcmk__native_allocate: ip-192.168.24.150 allocation score on controller-2: INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on database-0: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on database-1: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on database-2: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ip-192.168.24.150 allocation score on messaging-2: -INFINITY pcmk__native_allocate: nova-evacuate allocation score on compute-0: -INFINITY pcmk__native_allocate: nova-evacuate allocation score on compute-1: -INFINITY pcmk__native_allocate: nova-evacuate allocation score on controller-0: 0 pcmk__native_allocate: nova-evacuate allocation score on controller-1: 0 pcmk__native_allocate: nova-evacuate allocation score on controller-2: 0 pcmk__native_allocate: nova-evacuate allocation score on database-0: 0 pcmk__native_allocate: nova-evacuate allocation score on database-1: 0 pcmk__native_allocate: nova-evacuate allocation score on database-2: 0 pcmk__native_allocate: nova-evacuate allocation score on messaging-0: 0 pcmk__native_allocate: nova-evacuate allocation score on messaging-1: 0 pcmk__native_allocate: nova-evacuate allocation score on messaging-2: 0 pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-0: 0 pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-1: 0 pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on controller-2: 0 pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-0: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-1: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on database-2: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: openstack-cinder-volume-podman-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-0: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-1: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on controller-2: 10000 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-0: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-1: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on database-2: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-0: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-1: 0 pcmk__native_allocate: ovn-dbs-bundle-0 allocation score on messaging-2: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-0: 10000 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-1: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on controller-2: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-0: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-1: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on database-2: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-0: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-1: 0 pcmk__native_allocate: ovn-dbs-bundle-1 allocation score on messaging-2: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-0: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-1: 10000 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on controller-2: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-0: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-1: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on database-2: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-0: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-1: 0 pcmk__native_allocate: ovn-dbs-bundle-2 allocation score on messaging-2: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-0: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-1: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on controller-2: INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-0: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-1: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-1: 0 pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: ovn-dbs-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__native_allocate: ovndb_servers:0 allocation score on ovn-dbs-bundle-0: INFINITY pcmk__native_allocate: ovndb_servers:1 allocation score on ovn-dbs-bundle-1: INFINITY pcmk__native_allocate: ovndb_servers:2 allocation score on ovn-dbs-bundle-2: INFINITY pcmk__native_allocate: rabbitmq-bundle-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-0: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-1: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on controller-2: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-0: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-1: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on database-2: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-0: 10000 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-1: 0 pcmk__native_allocate: rabbitmq-bundle-0 allocation score on messaging-2: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-0: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-1: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on controller-2: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-0: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-1: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on database-2: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-0: 0 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-1: 10000 pcmk__native_allocate: rabbitmq-bundle-1 allocation score on messaging-2: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-0: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-1: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on controller-2: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-0: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-1: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on database-2: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-0: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-1: 0 pcmk__native_allocate: rabbitmq-bundle-2 allocation score on messaging-2: 10000 pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on controller-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-0: 0 pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-1: 0 pcmk__native_allocate: rabbitmq-bundle-podman-0 allocation score on messaging-2: 0 pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-1: 0 pcmk__native_allocate: rabbitmq-bundle-podman-1 allocation score on messaging-2: 0 pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: rabbitmq-bundle-podman-2 allocation score on messaging-2: 0 pcmk__native_allocate: rabbitmq:0 allocation score on rabbitmq-bundle-0: INFINITY pcmk__native_allocate: rabbitmq:1 allocation score on rabbitmq-bundle-1: INFINITY pcmk__native_allocate: rabbitmq:2 allocation score on rabbitmq-bundle-2: INFINITY pcmk__native_allocate: redis-bundle-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-0 allocation score on controller-0: 0 pcmk__native_allocate: redis-bundle-0 allocation score on controller-1: 0 pcmk__native_allocate: redis-bundle-0 allocation score on controller-2: 10000 pcmk__native_allocate: redis-bundle-0 allocation score on database-0: 0 pcmk__native_allocate: redis-bundle-0 allocation score on database-1: 0 pcmk__native_allocate: redis-bundle-0 allocation score on database-2: 0 pcmk__native_allocate: redis-bundle-0 allocation score on messaging-0: 0 pcmk__native_allocate: redis-bundle-0 allocation score on messaging-1: 0 pcmk__native_allocate: redis-bundle-0 allocation score on messaging-2: 0 pcmk__native_allocate: redis-bundle-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-1 allocation score on controller-0: 10000 pcmk__native_allocate: redis-bundle-1 allocation score on controller-1: 0 pcmk__native_allocate: redis-bundle-1 allocation score on controller-2: 0 pcmk__native_allocate: redis-bundle-1 allocation score on database-0: 0 pcmk__native_allocate: redis-bundle-1 allocation score on database-1: 0 pcmk__native_allocate: redis-bundle-1 allocation score on database-2: 0 pcmk__native_allocate: redis-bundle-1 allocation score on messaging-0: 0 pcmk__native_allocate: redis-bundle-1 allocation score on messaging-1: 0 pcmk__native_allocate: redis-bundle-1 allocation score on messaging-2: 0 pcmk__native_allocate: redis-bundle-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-2 allocation score on controller-0: 0 pcmk__native_allocate: redis-bundle-2 allocation score on controller-1: 10000 pcmk__native_allocate: redis-bundle-2 allocation score on controller-2: 0 pcmk__native_allocate: redis-bundle-2 allocation score on database-0: 0 pcmk__native_allocate: redis-bundle-2 allocation score on database-1: 0 pcmk__native_allocate: redis-bundle-2 allocation score on database-2: 0 pcmk__native_allocate: redis-bundle-2 allocation score on messaging-0: 0 pcmk__native_allocate: redis-bundle-2 allocation score on messaging-1: 0 pcmk__native_allocate: redis-bundle-2 allocation score on messaging-2: 0 pcmk__native_allocate: redis-bundle-podman-0 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-0: 0 pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-1: 0 pcmk__native_allocate: redis-bundle-podman-0 allocation score on controller-2: 0 pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on database-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-0 allocation score on messaging-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-0: 0 pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-1: 0 pcmk__native_allocate: redis-bundle-podman-1 allocation score on controller-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on database-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-1 allocation score on messaging-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on compute-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on compute-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-1: 0 pcmk__native_allocate: redis-bundle-podman-2 allocation score on controller-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on database-2: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-0: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-1: -INFINITY pcmk__native_allocate: redis-bundle-podman-2 allocation score on messaging-2: -INFINITY pcmk__native_allocate: redis:0 allocation score on redis-bundle-0: INFINITY pcmk__native_allocate: redis:1 allocation score on redis-bundle-1: INFINITY pcmk__native_allocate: redis:2 allocation score on redis-bundle-2: INFINITY pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_compute-fence-nova allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-0: -10000 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254001f5f3c allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-52540033df9c allocation score on messaging-2: -10000 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on controller-2: -10000 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254003f88b4 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400642894 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-1: -10000 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254007b7920 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-1: -10000 pcmk__native_allocate: stonith-fence_ipmilan-5254009cb549 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on database-2: -10000 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400bb150b allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400d5382b allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-0: -10000 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400dc0f81 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-0: -10000 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400e10267 allocation score on messaging-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on compute-0: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on compute-1: -INFINITY pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on controller-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-1: -10000 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on database-2: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-0: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-1: 0 pcmk__native_allocate: stonith-fence_ipmilan-525400ffc780 allocation score on messaging-2: 0 redis:0 promotion score on redis-bundle-0: 1 redis:1 promotion score on redis-bundle-1: 1 redis:2 promotion score on redis-bundle-2: 1 diff --git a/cts/scheduler/summary/remote-connection-shutdown.summary b/cts/scheduler/summary/remote-connection-shutdown.summary index 8756c33333..513df3a594 100644 --- a/cts/scheduler/summary/remote-connection-shutdown.summary +++ b/cts/scheduler/summary/remote-connection-shutdown.summary @@ -1,186 +1,162 @@ Using the original execution date of: 2020-11-17 07:03:16Z - Current cluster status: -Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] -RemoteOnline: [ compute-0 compute-1 ] -GuestOnline: [ galera-bundle-0:galera-bundle-podman-0 galera-bundle-1:galera-bundle-podman-1 galera-bundle-2:galera-bundle-podman-2 ovn-dbs-bundle-0:ovn-dbs-bundle-podman-0 ovn-dbs-bundle-1:ovn-dbs-bundle-podman-1 ovn-dbs-bundle-2:ovn-dbs-bundle-podman-2 rabbitmq-bundle-0:rabbitmq-bundle-podman-0 rabbitmq-bundle-1:rabbitmq-bundle-podman-1 rabbitmq-bundle-2:rabbitmq-bundle-podman-2 redis-bundle-0:redis-bundle-podman-0 redis-bundle-1:redis-bundle-podman-1 redis-bundle-2:redis-bundle-podman-2 ] + * Node List: + * Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] + * RemoteOnline: [ compute-0 compute-1 ] + * GuestOnline: [ galera-bundle-0@database-0 galera-bundle-1@database-1 galera-bundle-2@database-2 ovn-dbs-bundle-0@controller-2 ovn-dbs-bundle-1@controller-0 ovn-dbs-bundle-2@controller-1 rabbitmq-bundle-0@messaging-0 rabbitmq-bundle-1@messaging-1 rabbitmq-bundle-2@messaging-2 redis-bundle-0@controller-2 redis-bundle-1@controller-0 redis-bundle-2@controller-1 ] - compute-0 (ocf::pacemaker:remote): Started controller-0 - compute-1 (ocf::pacemaker:remote): Started controller-1 - Container bundle set: galera-bundle [cluster.common.tag/mariadb:pcmklatest] - galera-bundle-0 (ocf::heartbeat:galera): Master database-0 - galera-bundle-1 (ocf::heartbeat:galera): Master database-1 - galera-bundle-2 (ocf::heartbeat:galera): Master database-2 - Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq:pcmklatest] - rabbitmq-bundle-0 (ocf::heartbeat:rabbitmq-cluster): Started messaging-0 - rabbitmq-bundle-1 (ocf::heartbeat:rabbitmq-cluster): Started messaging-1 - rabbitmq-bundle-2 (ocf::heartbeat:rabbitmq-cluster): Started messaging-2 - Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest] - redis-bundle-0 (ocf::heartbeat:redis): Master controller-2 - redis-bundle-1 (ocf::heartbeat:redis): Slave controller-0 - redis-bundle-2 (ocf::heartbeat:redis): Slave controller-1 - ip-192.168.24.150 (ocf::heartbeat:IPaddr2): Started controller-2 - ip-10.0.0.150 (ocf::heartbeat:IPaddr2): Started controller-0 - ip-172.17.1.151 (ocf::heartbeat:IPaddr2): Started controller-1 - ip-172.17.1.150 (ocf::heartbeat:IPaddr2): Started controller-2 - ip-172.17.3.150 (ocf::heartbeat:IPaddr2): Started controller-0 - ip-172.17.4.150 (ocf::heartbeat:IPaddr2): Started controller-1 - Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest] - haproxy-bundle-podman-0 (ocf::heartbeat:podman): Started controller-2 - haproxy-bundle-podman-1 (ocf::heartbeat:podman): Started controller-0 - haproxy-bundle-podman-2 (ocf::heartbeat:podman): Started controller-1 - Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest] - ovn-dbs-bundle-0 (ocf::ovn:ovndb-servers): Master controller-2 - ovn-dbs-bundle-1 (ocf::ovn:ovndb-servers): Slave controller-0 - ovn-dbs-bundle-2 (ocf::ovn:ovndb-servers): Slave controller-1 - ip-172.17.1.57 (ocf::heartbeat:IPaddr2): Started controller-2 - stonith-fence_compute-fence-nova (stonith:fence_compute): Stopped - Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger] - Started: [ compute-0 compute-1 ] - Stopped: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] - nova-evacuate (ocf::openstack:NovaEvacuate): Started database-0 - stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-1 - stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started database-2 - stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-0 - stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-1 - stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 - stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 - stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 - stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started messaging-2 - stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-0 - stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 - stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 - Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest] - openstack-cinder-volume-podman-0 (ocf::heartbeat:podman): Started controller-0 + * Full List of Resources: + * compute-0 (ocf:pacemaker:remote): Started controller-0 + * compute-1 (ocf:pacemaker:remote): Started controller-1 + * Container bundle set: galera-bundle [cluster.common.tag/mariadb:pcmklatest]: + * galera-bundle-0 (ocf:heartbeat:galera): Promoted database-0 + * galera-bundle-1 (ocf:heartbeat:galera): Promoted database-1 + * galera-bundle-2 (ocf:heartbeat:galera): Promoted database-2 + * Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq:pcmklatest]: + * rabbitmq-bundle-0 (ocf:heartbeat:rabbitmq-cluster): Started messaging-0 + * rabbitmq-bundle-1 (ocf:heartbeat:rabbitmq-cluster): Started messaging-1 + * rabbitmq-bundle-2 (ocf:heartbeat:rabbitmq-cluster): Started messaging-2 + * Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest]: + * redis-bundle-0 (ocf:heartbeat:redis): Promoted controller-2 + * redis-bundle-1 (ocf:heartbeat:redis): Unpromoted controller-0 + * redis-bundle-2 (ocf:heartbeat:redis): Unpromoted controller-1 + * ip-192.168.24.150 (ocf:heartbeat:IPaddr2): Started controller-2 + * ip-10.0.0.150 (ocf:heartbeat:IPaddr2): Started controller-0 + * ip-172.17.1.151 (ocf:heartbeat:IPaddr2): Started controller-1 + * ip-172.17.1.150 (ocf:heartbeat:IPaddr2): Started controller-2 + * ip-172.17.3.150 (ocf:heartbeat:IPaddr2): Started controller-0 + * ip-172.17.4.150 (ocf:heartbeat:IPaddr2): Started controller-1 + * Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest]: + * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-2 + * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-0 + * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-1 + * Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest]: + * ovn-dbs-bundle-0 (ocf:ovn:ovndb-servers): Promoted controller-2 + * ovn-dbs-bundle-1 (ocf:ovn:ovndb-servers): Unpromoted controller-0 + * ovn-dbs-bundle-2 (ocf:ovn:ovndb-servers): Unpromoted controller-1 + * ip-172.17.1.57 (ocf:heartbeat:IPaddr2): Started controller-2 + * stonith-fence_compute-fence-nova (stonith:fence_compute): Stopped + * Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger]: + * Started: [ compute-0 compute-1 ] + * Stopped: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] + * nova-evacuate (ocf:openstack:NovaEvacuate): Started database-0 + * stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-1 + * stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started database-2 + * stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-0 + * stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-1 + * stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 + * stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 + * stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 + * stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started messaging-2 + * stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-0 + * stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 + * stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 + * Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest]: + * openstack-cinder-volume-podman-0 (ocf:heartbeat:podman): Started controller-0 -Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-0 changed -Only 'private' parameters to stonith-fence_compute-fence-nova for unfencing compute-1 changed -Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_start_0 on database-0 changed: 0:0;322:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254009cb549_monitor_60000 on database-0 changed: 0:0;323:1375:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to nova-evacuate_start_0 on database-0 changed: 0:0;258:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to nova-evacuate_monitor_10000 on database-0 changed: 0:0;259:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_start_0 on database-1 changed: 0:0;330:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400dc0f81_monitor_60000 on database-1 changed: 0:0;331:1380:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_start_0 on database-1 changed: 0:0;261:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-52540033df9c_monitor_60000 on database-1 changed: 0:0;263:1420:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_start_0 on database-2 changed: 0:0;319:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400d5382b_monitor_60000 on database-2 changed: 0:0;320:1374:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_start_0 on database-2 changed: 0:0;263:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254001f5f3c_monitor_60000 on database-2 changed: 0:0;265:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400e10267_start_0 on messaging-1 changed: 0:0;320:1317:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400e10267_monitor_60000 on messaging-1 changed: 0:0;326:1318:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_start_0 on messaging-1 changed: 0:0;271:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254007b7920_monitor_60000 on messaging-1 changed: 0:0;273:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_start_0 on messaging-0 changed: 0:0;324:70:0:40f880e4-b328-4380-9703-47856390a1e0 -Only 'private' parameters to stonith-fence_ipmilan-525400bb150b_monitor_60000 on messaging-0 changed: 0:0;325:70:0:40f880e4-b328-4380-9703-47856390a1e0 -Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_start_0 on messaging-0 changed: 0:0;267:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-5254003f88b4_monitor_60000 on messaging-0 changed: 0:0;269:1422:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400642894_start_0 on messaging-2 changed: 0:0;272:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400642894_monitor_60000 on messaging-2 changed: 0:0;274:1424:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_start_0 on messaging-2 changed: 0:0;321:49:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 -Only 'private' parameters to stonith-fence_ipmilan-525400ffc780_monitor_60000 on messaging-2 changed: 0:0;323:50:0:51c2f6fa-d5ae-4ae7-b8df-b121f8ea9269 Transition Summary: * Stop compute-0 ( controller-0 ) due to node availability * Start stonith-fence_compute-fence-nova ( database-0 ) * Stop compute-unfence-trigger:0 ( compute-0 ) due to node availability * Move nova-evacuate ( database-0 -> database-1 ) * Move stonith-fence_ipmilan-52540033df9c ( database-1 -> database-2 ) * Move stonith-fence_ipmilan-5254001f5f3c ( database-2 -> messaging-0 ) * Move stonith-fence_ipmilan-5254003f88b4 ( messaging-0 -> messaging-1 ) * Move stonith-fence_ipmilan-5254007b7920 ( messaging-1 -> messaging-2 ) * Move stonith-fence_ipmilan-525400ffc780 ( messaging-2 -> database-0 ) * Move stonith-fence_ipmilan-5254009cb549 ( database-0 -> database-1 ) -Executing cluster transition: +Executing Cluster Transition: * Resource action: stonith-fence_compute-fence-nova start on database-0 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-2 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-0 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on messaging-1 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-2 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-1 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on controller-0 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-2 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-1 * Cluster action: clear_failcount for stonith-fence_compute-fence-nova on database-0 * Pseudo action: compute-unfence-trigger-clone_stop_0 * Resource action: nova-evacuate stop on database-0 * Resource action: stonith-fence_ipmilan-52540033df9c stop on database-1 * Resource action: stonith-fence_ipmilan-5254001f5f3c stop on database-2 * Resource action: stonith-fence_ipmilan-5254003f88b4 stop on messaging-0 * Resource action: stonith-fence_ipmilan-5254007b7920 stop on messaging-1 * Resource action: stonith-fence_ipmilan-525400ffc780 stop on messaging-2 * Resource action: stonith-fence_ipmilan-5254009cb549 stop on database-0 * Resource action: stonith-fence_compute-fence-nova monitor=60000 on database-0 * Resource action: compute-unfence-trigger stop on compute-0 * Pseudo action: compute-unfence-trigger-clone_stopped_0 * Resource action: nova-evacuate start on database-1 * Resource action: stonith-fence_ipmilan-52540033df9c start on database-2 * Resource action: stonith-fence_ipmilan-5254001f5f3c start on messaging-0 * Resource action: stonith-fence_ipmilan-5254003f88b4 start on messaging-1 * Resource action: stonith-fence_ipmilan-5254007b7920 start on messaging-2 * Resource action: stonith-fence_ipmilan-525400ffc780 start on database-0 * Resource action: stonith-fence_ipmilan-5254009cb549 start on database-1 * Resource action: compute-0 stop on controller-0 * Resource action: nova-evacuate monitor=10000 on database-1 * Resource action: stonith-fence_ipmilan-52540033df9c monitor=60000 on database-2 * Resource action: stonith-fence_ipmilan-5254001f5f3c monitor=60000 on messaging-0 * Resource action: stonith-fence_ipmilan-5254003f88b4 monitor=60000 on messaging-1 * Resource action: stonith-fence_ipmilan-5254007b7920 monitor=60000 on messaging-2 * Resource action: stonith-fence_ipmilan-525400ffc780 monitor=60000 on database-0 * Resource action: stonith-fence_ipmilan-5254009cb549 monitor=60000 on database-1 Using the original execution date of: 2020-11-17 07:03:16Z -Revised cluster status: -Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] -RemoteOnline: [ compute-1 ] -RemoteOFFLINE: [ compute-0 ] -GuestOnline: [ galera-bundle-0:galera-bundle-podman-0 galera-bundle-1:galera-bundle-podman-1 galera-bundle-2:galera-bundle-podman-2 ovn-dbs-bundle-0:ovn-dbs-bundle-podman-0 ovn-dbs-bundle-1:ovn-dbs-bundle-podman-1 ovn-dbs-bundle-2:ovn-dbs-bundle-podman-2 rabbitmq-bundle-0:rabbitmq-bundle-podman-0 rabbitmq-bundle-1:rabbitmq-bundle-podman-1 rabbitmq-bundle-2:rabbitmq-bundle-podman-2 redis-bundle-0:redis-bundle-podman-0 redis-bundle-1:redis-bundle-podman-1 redis-bundle-2:redis-bundle-podman-2 ] - - compute-0 (ocf::pacemaker:remote): Stopped - compute-1 (ocf::pacemaker:remote): Started controller-1 - Container bundle set: galera-bundle [cluster.common.tag/mariadb:pcmklatest] - galera-bundle-0 (ocf::heartbeat:galera): Master database-0 - galera-bundle-1 (ocf::heartbeat:galera): Master database-1 - galera-bundle-2 (ocf::heartbeat:galera): Master database-2 - Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq:pcmklatest] - rabbitmq-bundle-0 (ocf::heartbeat:rabbitmq-cluster): Started messaging-0 - rabbitmq-bundle-1 (ocf::heartbeat:rabbitmq-cluster): Started messaging-1 - rabbitmq-bundle-2 (ocf::heartbeat:rabbitmq-cluster): Started messaging-2 - Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest] - redis-bundle-0 (ocf::heartbeat:redis): Master controller-2 - redis-bundle-1 (ocf::heartbeat:redis): Slave controller-0 - redis-bundle-2 (ocf::heartbeat:redis): Slave controller-1 - ip-192.168.24.150 (ocf::heartbeat:IPaddr2): Started controller-2 - ip-10.0.0.150 (ocf::heartbeat:IPaddr2): Started controller-0 - ip-172.17.1.151 (ocf::heartbeat:IPaddr2): Started controller-1 - ip-172.17.1.150 (ocf::heartbeat:IPaddr2): Started controller-2 - ip-172.17.3.150 (ocf::heartbeat:IPaddr2): Started controller-0 - ip-172.17.4.150 (ocf::heartbeat:IPaddr2): Started controller-1 - Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest] - haproxy-bundle-podman-0 (ocf::heartbeat:podman): Started controller-2 - haproxy-bundle-podman-1 (ocf::heartbeat:podman): Started controller-0 - haproxy-bundle-podman-2 (ocf::heartbeat:podman): Started controller-1 - Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest] - ovn-dbs-bundle-0 (ocf::ovn:ovndb-servers): Master controller-2 - ovn-dbs-bundle-1 (ocf::ovn:ovndb-servers): Slave controller-0 - ovn-dbs-bundle-2 (ocf::ovn:ovndb-servers): Slave controller-1 - ip-172.17.1.57 (ocf::heartbeat:IPaddr2): Started controller-2 - stonith-fence_compute-fence-nova (stonith:fence_compute): Started database-0 - Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger] - Started: [ compute-1 ] - Stopped: [ compute-0 controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] - nova-evacuate (ocf::openstack:NovaEvacuate): Started database-1 - stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-2 - stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started messaging-0 - stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-1 - stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-2 - stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 - stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 - stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 - stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started database-0 - stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-1 - stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 - stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 - Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest] - openstack-cinder-volume-podman-0 (ocf::heartbeat:podman): Started controller-0 +Revised Cluster Status: + * Node List: + * Online: [ controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] + * RemoteOnline: [ compute-1 ] + * RemoteOFFLINE: [ compute-0 ] + * GuestOnline: [ galera-bundle-0@database-0 galera-bundle-1@database-1 galera-bundle-2@database-2 ovn-dbs-bundle-0@controller-2 ovn-dbs-bundle-1@controller-0 ovn-dbs-bundle-2@controller-1 rabbitmq-bundle-0@messaging-0 rabbitmq-bundle-1@messaging-1 rabbitmq-bundle-2@messaging-2 redis-bundle-0@controller-2 redis-bundle-1@controller-0 redis-bundle-2@controller-1 ] + * Full List of Resources: + * compute-0 (ocf:pacemaker:remote): Stopped + * compute-1 (ocf:pacemaker:remote): Started controller-1 + * Container bundle set: galera-bundle [cluster.common.tag/mariadb:pcmklatest]: + * galera-bundle-0 (ocf:heartbeat:galera): Promoted database-0 + * galera-bundle-1 (ocf:heartbeat:galera): Promoted database-1 + * galera-bundle-2 (ocf:heartbeat:galera): Promoted database-2 + * Container bundle set: rabbitmq-bundle [cluster.common.tag/rabbitmq:pcmklatest]: + * rabbitmq-bundle-0 (ocf:heartbeat:rabbitmq-cluster): Started messaging-0 + * rabbitmq-bundle-1 (ocf:heartbeat:rabbitmq-cluster): Started messaging-1 + * rabbitmq-bundle-2 (ocf:heartbeat:rabbitmq-cluster): Started messaging-2 + * Container bundle set: redis-bundle [cluster.common.tag/redis:pcmklatest]: + * redis-bundle-0 (ocf:heartbeat:redis): Promoted controller-2 + * redis-bundle-1 (ocf:heartbeat:redis): Unpromoted controller-0 + * redis-bundle-2 (ocf:heartbeat:redis): Unpromoted controller-1 + * ip-192.168.24.150 (ocf:heartbeat:IPaddr2): Started controller-2 + * ip-10.0.0.150 (ocf:heartbeat:IPaddr2): Started controller-0 + * ip-172.17.1.151 (ocf:heartbeat:IPaddr2): Started controller-1 + * ip-172.17.1.150 (ocf:heartbeat:IPaddr2): Started controller-2 + * ip-172.17.3.150 (ocf:heartbeat:IPaddr2): Started controller-0 + * ip-172.17.4.150 (ocf:heartbeat:IPaddr2): Started controller-1 + * Container bundle set: haproxy-bundle [cluster.common.tag/haproxy:pcmklatest]: + * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-2 + * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-0 + * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-1 + * Container bundle set: ovn-dbs-bundle [cluster.common.tag/ovn-northd:pcmklatest]: + * ovn-dbs-bundle-0 (ocf:ovn:ovndb-servers): Promoted controller-2 + * ovn-dbs-bundle-1 (ocf:ovn:ovndb-servers): Unpromoted controller-0 + * ovn-dbs-bundle-2 (ocf:ovn:ovndb-servers): Unpromoted controller-1 + * ip-172.17.1.57 (ocf:heartbeat:IPaddr2): Started controller-2 + * stonith-fence_compute-fence-nova (stonith:fence_compute): Started database-0 + * Clone Set: compute-unfence-trigger-clone [compute-unfence-trigger]: + * Started: [ compute-1 ] + * Stopped: [ compute-0 controller-0 controller-1 controller-2 database-0 database-1 database-2 messaging-0 messaging-1 messaging-2 ] + * nova-evacuate (ocf:openstack:NovaEvacuate): Started database-1 + * stonith-fence_ipmilan-52540033df9c (stonith:fence_ipmilan): Started database-2 + * stonith-fence_ipmilan-5254001f5f3c (stonith:fence_ipmilan): Started messaging-0 + * stonith-fence_ipmilan-5254003f88b4 (stonith:fence_ipmilan): Started messaging-1 + * stonith-fence_ipmilan-5254007b7920 (stonith:fence_ipmilan): Started messaging-2 + * stonith-fence_ipmilan-525400642894 (stonith:fence_ipmilan): Started messaging-2 + * stonith-fence_ipmilan-525400d5382b (stonith:fence_ipmilan): Started database-2 + * stonith-fence_ipmilan-525400bb150b (stonith:fence_ipmilan): Started messaging-0 + * stonith-fence_ipmilan-525400ffc780 (stonith:fence_ipmilan): Started database-0 + * stonith-fence_ipmilan-5254009cb549 (stonith:fence_ipmilan): Started database-1 + * stonith-fence_ipmilan-525400e10267 (stonith:fence_ipmilan): Started messaging-1 + * stonith-fence_ipmilan-525400dc0f81 (stonith:fence_ipmilan): Started database-1 + * Container bundle: openstack-cinder-volume [cluster.common.tag/cinder-volume:pcmklatest]: + * openstack-cinder-volume-podman-0 (ocf:heartbeat:podman): Started controller-0 diff --git a/lib/pacemaker/libpacemaker_private.h b/lib/pacemaker/libpacemaker_private.h index 3585703070..a2fd5baabb 100644 --- a/lib/pacemaker/libpacemaker_private.h +++ b/lib/pacemaker/libpacemaker_private.h @@ -1,430 +1,435 @@ /* * Copyright 2021-2022 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU Lesser General Public License * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. */ #ifndef PCMK__LIBPACEMAKER_PRIVATE__H # define PCMK__LIBPACEMAKER_PRIVATE__H /* This header is for the sole use of libpacemaker, so that functions can be * declared with G_GNUC_INTERNAL for efficiency. */ #include // pe_action_t, pe_node_t, pe_working_set_t // Actions (pcmk_sched_actions.c) G_GNUC_INTERNAL void pcmk__update_action_for_orderings(pe_action_t *action, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__log_action(const char *pre_text, pe_action_t *action, bool details); G_GNUC_INTERNAL pe_action_t *pcmk__new_rsc_pseudo_action(pe_resource_t *rsc, const char *task, bool optional, bool runnable); G_GNUC_INTERNAL pe_action_t *pcmk__new_cancel_action(pe_resource_t *rsc, const char *name, guint interval_ms, pe_node_t *node); G_GNUC_INTERNAL pe_action_t *pcmk__new_shutdown_action(pe_node_t *node); G_GNUC_INTERNAL bool pcmk__action_locks_rsc_to_node(const pe_action_t *action); G_GNUC_INTERNAL void pcmk__deduplicate_action_inputs(pe_action_t *action); G_GNUC_INTERNAL void pcmk__output_actions(pe_working_set_t *data_set); G_GNUC_INTERNAL bool pcmk__check_action_config(pe_resource_t *rsc, pe_node_t *node, xmlNode *xml_op); G_GNUC_INTERNAL void pcmk__handle_rsc_config_changes(pe_working_set_t *data_set); // Producing transition graphs (pcmk_graph_producer.c) G_GNUC_INTERNAL bool pcmk__graph_has_loop(pe_action_t *init_action, pe_action_t *action, pe_action_wrapper_t *input); G_GNUC_INTERNAL void pcmk__add_action_to_graph(pe_action_t *action, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__create_graph(pe_working_set_t *data_set); // Fencing (pcmk_sched_fencing.c) G_GNUC_INTERNAL void pcmk__order_vs_fence(pe_action_t *stonith_op, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__order_vs_unfence(pe_resource_t *rsc, pe_node_t *node, pe_action_t *action, enum pe_ordering order, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__fence_guest(pe_node_t *node); G_GNUC_INTERNAL bool pcmk__node_unfenced(pe_node_t *node); // Injected scheduler inputs (pcmk_sched_injections.c) void pcmk__inject_scheduler_input(pe_working_set_t *data_set, cib_t *cib, pcmk_injections_t *injections); // Constraints of any type (pcmk_sched_constraints.c) G_GNUC_INTERNAL pe_resource_t *pcmk__find_constraint_resource(GList *rsc_list, const char *id); G_GNUC_INTERNAL xmlNode *pcmk__expand_tags_in_sets(xmlNode *xml_obj, pe_working_set_t *data_set); G_GNUC_INTERNAL bool pcmk__valid_resource_or_tag(pe_working_set_t *data_set, const char *id, pe_resource_t **rsc, pe_tag_t **tag); G_GNUC_INTERNAL bool pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, bool convert_rsc, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__create_internal_constraints(pe_working_set_t *data_set); // Location constraints G_GNUC_INTERNAL void pcmk__unpack_location(xmlNode *xml_obj, pe_working_set_t *data_set); G_GNUC_INTERNAL pe__location_t *pcmk__new_location(const char *id, pe_resource_t *rsc, int node_weight, const char *discover_mode, pe_node_t *foo_node, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__apply_locations(pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__apply_location(pe__location_t *constraint, pe_resource_t *rsc); -// Colocation constraints +// Colocation constraints (pcmk_sched_colocation.c) enum pcmk__coloc_affects { pcmk__coloc_affects_nothing = 0, pcmk__coloc_affects_location, pcmk__coloc_affects_role, }; G_GNUC_INTERNAL enum pcmk__coloc_affects pcmk__colocation_affects(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, bool preview); G_GNUC_INTERNAL void pcmk__apply_coloc_to_weights(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint); G_GNUC_INTERNAL void pcmk__apply_coloc_to_priority(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint); +G_GNUC_INTERNAL +void pcmk__apply_colocation(pcmk__colocation_t *colocation, + pe_resource_t *rsc1, pe_resource_t *rsc2, + uint32_t flags); + G_GNUC_INTERNAL void pcmk__unpack_colocation(xmlNode *xml_obj, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__new_colocation(const char *id, const char *node_attr, int score, pe_resource_t *dependent, pe_resource_t *primary, const char *dependent_role, const char *primary_role, bool influence, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__block_colocated_starts(pe_action_t *action, pe_working_set_t *data_set); /*! * \internal * \brief Check whether colocation's left-hand preferences should be considered * * \param[in] colocation Colocation constraint * \param[in] rsc Right-hand instance (normally this will be * colocation->primary, which NULL will be treated as, * but for clones or bundles with multiple instances * this can be a particular instance) * * \return true if colocation influence should be effective, otherwise false */ static inline bool pcmk__colocation_has_influence(const pcmk__colocation_t *colocation, const pe_resource_t *rsc) { if (rsc == NULL) { rsc = colocation->primary; } /* The left hand of a colocation influences the right hand's location * if the influence option is true, or the right hand is not yet active. */ return colocation->influence || (rsc->running_on == NULL); } // Ordering constraints (pcmk_sched_ordering.c) G_GNUC_INTERNAL void pcmk__new_ordering(pe_resource_t *lh_rsc, char *lh_task, pe_action_t *lh_action, pe_resource_t *rh_rsc, char *rh_task, pe_action_t *rh_action, enum pe_ordering type, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__unpack_ordering(xmlNode *xml_obj, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__disable_invalid_orderings(pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__order_stops_before_shutdown(pe_node_t *node, pe_action_t *shutdown_op, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__apply_orderings(pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__order_after_each(pe_action_t *after, GList *list); /*! * \internal * \brief Create a new ordering between two resource actions * * \param[in] lh_rsc Resource for 'first' action * \param[in] rh_rsc Resource for 'then' action * \param[in] lh_task Action key for 'first' action * \param[in] rh_task Action key for 'then' action * \param[in] flags Bitmask of enum pe_ordering flags * \param[in] data_set Cluster working set to add ordering to */ #define pcmk__order_resource_actions(lh_rsc, lh_task, rh_rsc, rh_task, \ flags, data_set) \ pcmk__new_ordering((lh_rsc), pcmk__op_key((lh_rsc)->id, (lh_task), 0), \ NULL, \ (rh_rsc), pcmk__op_key((rh_rsc)->id, (rh_task), 0), \ NULL, (flags), (data_set)) #define pcmk__order_starts(rsc1, rsc2, type, data_set) \ pcmk__order_resource_actions((rsc1), CRMD_ACTION_START, \ (rsc2), CRMD_ACTION_START, (type), (data_set)) #define pcmk__order_stops(rsc1, rsc2, type, data_set) \ pcmk__order_resource_actions((rsc1), CRMD_ACTION_STOP, \ (rsc2), CRMD_ACTION_STOP, (type), (data_set)) G_GNUC_INTERNAL void pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__require_promotion_tickets(pe_resource_t *rsc); G_GNUC_INTERNAL bool pcmk__is_failed_remote_node(pe_node_t *node); G_GNUC_INTERNAL void pcmk__order_remote_connection_actions(pe_working_set_t *data_set); G_GNUC_INTERNAL bool pcmk__rsc_corresponds_to_guest(pe_resource_t *rsc, pe_node_t *node); G_GNUC_INTERNAL pe_node_t *pcmk__connection_host_for_action(pe_action_t *action); G_GNUC_INTERNAL void pcmk__substitute_remote_addr(pe_resource_t *rsc, GHashTable *params); G_GNUC_INTERNAL void pcmk__add_bundle_meta_to_xml(xmlNode *args_xml, pe_action_t *action); // Groups (pcmk_sched_group.c) G_GNUC_INTERNAL GList *pcmk__group_colocated_resources(pe_resource_t *rsc, pe_resource_t *orig_rsc, GList *colocated_rscs); // Bundles (pcmk_sched_bundle.c) G_GNUC_INTERNAL void pcmk__output_bundle_actions(pe_resource_t *rsc); // Injections (pcmk_injections.c) G_GNUC_INTERNAL xmlNode *pcmk__inject_node(cib_t *cib_conn, const char *node, const char *uuid); G_GNUC_INTERNAL xmlNode *pcmk__inject_node_state_change(cib_t *cib_conn, const char *node, bool up); G_GNUC_INTERNAL xmlNode *pcmk__inject_resource_history(pcmk__output_t *out, xmlNode *cib_node, const char *resource, const char *lrm_name, const char *rclass, const char *rtype, const char *rprovider); G_GNUC_INTERNAL void pcmk__inject_failcount(pcmk__output_t *out, xmlNode *cib_node, const char *resource, const char *task, guint interval_ms, int rc); G_GNUC_INTERNAL xmlNode *pcmk__inject_action_result(xmlNode *cib_resource, lrmd_event_data_t *op, int target_rc); // Nodes (pcmk_sched_nodes.c) G_GNUC_INTERNAL bool pcmk__node_available(const pe_node_t *node, bool consider_score, bool consider_guest); G_GNUC_INTERNAL bool pcmk__any_node_available(GHashTable *nodes); G_GNUC_INTERNAL GHashTable *pcmk__copy_node_table(GHashTable *nodes); G_GNUC_INTERNAL GList *pcmk__sort_nodes(GList *nodes, pe_node_t *active_node, pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__apply_node_health(pe_working_set_t *data_set); G_GNUC_INTERNAL pe_node_t *pcmk__top_allowed_node(const pe_resource_t *rsc, const pe_node_t *node); // Clone notifictions (pcmk_sched_notif.c) G_GNUC_INTERNAL void pcmk__create_notifications(pe_resource_t *rsc, notify_data_t *n_data); G_GNUC_INTERNAL notify_data_t *pcmk__clone_notif_pseudo_ops(pe_resource_t *rsc, const char *task, pe_action_t *action, pe_action_t *complete); G_GNUC_INTERNAL void pcmk__free_notification_data(notify_data_t *n_data); G_GNUC_INTERNAL void pcmk__order_notifs_after_fencing(pe_action_t *action, pe_resource_t *rsc, pe_action_t *stonith_op); // Functions applying to more than one variant (pcmk_sched_resource.c) G_GNUC_INTERNAL void pcmk__set_allocation_methods(pe_working_set_t *data_set); G_GNUC_INTERNAL bool pcmk__rsc_agent_changed(pe_resource_t *rsc, pe_node_t *node, const xmlNode *rsc_entry, bool active_on_node); G_GNUC_INTERNAL GList *pcmk__rscs_matching_id(const char *id, pe_working_set_t *data_set); G_GNUC_INTERNAL GList *pcmk__colocated_resources(pe_resource_t *rsc, pe_resource_t *orig_rsc, GList *colocated_rscs); G_GNUC_INTERNAL void pcmk__output_resource_actions(pe_resource_t *rsc); G_GNUC_INTERNAL bool pcmk__assign_primitive(pe_resource_t *rsc, pe_node_t *chosen, bool force); G_GNUC_INTERNAL bool pcmk__assign_resource(pe_resource_t *rsc, pe_node_t *node, bool force); G_GNUC_INTERNAL void pcmk__unassign_resource(pe_resource_t *rsc); G_GNUC_INTERNAL bool pcmk__threshold_reached(pe_resource_t *rsc, pe_node_t *node, pe_resource_t **failed); G_GNUC_INTERNAL void pcmk__sort_resources(pe_working_set_t *data_set); G_GNUC_INTERNAL gint pcmk__cmp_instance(gconstpointer a, gconstpointer b); G_GNUC_INTERNAL gint pcmk__cmp_instance_number(gconstpointer a, gconstpointer b); // Functions related to probes (pcmk_sched_probes.c) G_GNUC_INTERNAL void pcmk__order_probes(pe_working_set_t *data_set); G_GNUC_INTERNAL void pcmk__schedule_probes(pe_working_set_t *data_set); // Functions related to node utilization (pcmk_sched_utilization.c) G_GNUC_INTERNAL int pcmk__compare_node_capacities(const pe_node_t *node1, const pe_node_t *node2); G_GNUC_INTERNAL void pcmk__consume_node_capacity(GHashTable *current_utilization, pe_resource_t *rsc); G_GNUC_INTERNAL void pcmk__release_node_capacity(GHashTable *current_utilization, pe_resource_t *rsc); G_GNUC_INTERNAL void pcmk__ban_insufficient_capacity(pe_resource_t *rsc, pe_node_t **prefer); G_GNUC_INTERNAL void pcmk__create_utilization_constraints(pe_resource_t *rsc, GList *allowed_nodes); G_GNUC_INTERNAL void pcmk__show_node_capacities(const char *desc, pe_working_set_t *data_set); #endif // PCMK__LIBPACEMAKER_PRIVATE__H diff --git a/lib/pacemaker/pcmk_sched_clone.c b/lib/pacemaker/pcmk_sched_clone.c index 0fc93969ad..6a4c98840c 100644 --- a/lib/pacemaker/pcmk_sched_clone.c +++ b/lib/pacemaker/pcmk_sched_clone.c @@ -1,1168 +1,1165 @@ /* * Copyright 2004-2022 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. */ #include #include #include #include "libpacemaker_private.h" #define VARIANT_CLONE 1 #include static void append_parent_colocation(pe_resource_t * rsc, pe_resource_t * child, gboolean all); static pe_node_t * can_run_instance(pe_resource_t * rsc, pe_node_t * node, int limit) { pe_node_t *local_node = NULL; if (node == NULL && rsc->allowed_nodes) { GHashTableIter iter; g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&local_node)) { can_run_instance(rsc, local_node, limit); } return NULL; } if (!node) { /* make clang analyzer happy */ goto bail; } else if (!pcmk__node_available(node, false, false)) { goto bail; } else if (pcmk_is_set(rsc->flags, pe_rsc_orphan)) { goto bail; } local_node = pcmk__top_allowed_node(rsc, node); if (local_node == NULL) { crm_warn("%s cannot run on %s: node not allowed", rsc->id, node->details->uname); goto bail; } else if (local_node->weight < 0) { common_update_score(rsc, node->details->id, local_node->weight); pe_rsc_trace(rsc, "%s cannot run on %s: Parent node weight doesn't allow it.", rsc->id, node->details->uname); } else if (local_node->count < limit) { pe_rsc_trace(rsc, "%s can run on %s (already running %d)", rsc->id, node->details->uname, local_node->count); return local_node; } else { pe_rsc_trace(rsc, "%s cannot run on %s: node full (%d >= %d)", rsc->id, node->details->uname, local_node->count, limit); } bail: if (node) { common_update_score(rsc, node->details->id, -INFINITY); } return NULL; } static pe_node_t * allocate_instance(pe_resource_t *rsc, pe_node_t *prefer, gboolean all_coloc, int limit, pe_working_set_t *data_set) { pe_node_t *chosen = NULL; GHashTable *backup = NULL; CRM_ASSERT(rsc); pe_rsc_trace(rsc, "Checking allocation of %s (preferring %s, using %s parent colocations)", rsc->id, (prefer? prefer->details->uname: "none"), (all_coloc? "all" : "some")); if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return rsc->fns->location(rsc, NULL, FALSE); } else if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { pe_rsc_debug(rsc, "Dependency loop detected involving %s", rsc->id); return NULL; } /* Only include positive colocation preferences of dependent resources * if not every node will get a copy of the clone */ append_parent_colocation(rsc->parent, rsc, all_coloc); if (prefer) { pe_node_t *local_prefer = g_hash_table_lookup(rsc->allowed_nodes, prefer->details->id); if (local_prefer == NULL || local_prefer->weight < 0) { pe_rsc_trace(rsc, "Not pre-allocating %s to %s - unavailable", rsc->id, prefer->details->uname); return NULL; } } can_run_instance(rsc, NULL, limit); backup = pcmk__copy_node_table(rsc->allowed_nodes); pe_rsc_trace(rsc, "Allocating instance %s", rsc->id); chosen = rsc->cmds->allocate(rsc, prefer, data_set); if (chosen && prefer && (chosen->details != prefer->details)) { crm_info("Not pre-allocating %s to %s because %s is better", rsc->id, prefer->details->uname, chosen->details->uname); g_hash_table_destroy(rsc->allowed_nodes); rsc->allowed_nodes = backup; pcmk__unassign_resource(rsc); chosen = NULL; backup = NULL; } if (chosen) { pe_node_t *local_node = pcmk__top_allowed_node(rsc, chosen); if (local_node) { local_node->count++; } else if (pcmk_is_set(rsc->flags, pe_rsc_managed)) { /* what to do? we can't enforce per-node limits in this case */ pcmk__config_err("%s not found in %s (list of %d)", chosen->details->id, rsc->parent->id, g_hash_table_size(rsc->parent->allowed_nodes)); } } if(backup) { g_hash_table_destroy(backup); } return chosen; } static void append_parent_colocation(pe_resource_t * rsc, pe_resource_t * child, gboolean all) { GList *gIter = NULL; gIter = rsc->rsc_cons; for (; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter->data; if (all || cons->score < 0 || cons->score == INFINITY) { child->rsc_cons = g_list_prepend(child->rsc_cons, cons); } } gIter = rsc->rsc_cons_lhs; for (; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter->data; if (!pcmk__colocation_has_influence(cons, child)) { continue; } if (all || cons->score < 0) { child->rsc_cons_lhs = g_list_prepend(child->rsc_cons_lhs, cons); } } } void distribute_children(pe_resource_t *rsc, GList *children, GList *nodes, int max, int per_host_max, pe_working_set_t * data_set); void distribute_children(pe_resource_t *rsc, GList *children, GList *nodes, int max, int per_host_max, pe_working_set_t * data_set) { int loop_max = 0; int allocated = 0; int available_nodes = 0; bool all_coloc = false; /* count now tracks the number of clones currently allocated */ for(GList *nIter = nodes; nIter != NULL; nIter = nIter->next) { pe_node_t *node = nIter->data; node->count = 0; if (pcmk__node_available(node, false, false)) { available_nodes++; } } all_coloc = (max < available_nodes) ? true : false; if(available_nodes) { loop_max = max / available_nodes; } if (loop_max < 1) { loop_max = 1; } pe_rsc_debug(rsc, "Allocating up to %d %s instances to a possible %d nodes (at most %d per host, %d optimal)", max, rsc->id, available_nodes, per_host_max, loop_max); /* Pre-allocate as many instances as we can to their current location */ for (GList *gIter = children; gIter != NULL && allocated < max; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *) gIter->data; pe_node_t *child_node = NULL; pe_node_t *local_node = NULL; if ((child->running_on == NULL) || !pcmk_is_set(child->flags, pe_rsc_provisional) || pcmk_is_set(child->flags, pe_rsc_failed)) { continue; } child_node = pe__current_node(child); local_node = pcmk__top_allowed_node(child, child_node); pe_rsc_trace(rsc, "Checking pre-allocation of %s to %s (%d remaining of %d)", child->id, child_node->details->uname, max - allocated, max); if (!pcmk__node_available(child_node, true, false)) { pe_rsc_trace(rsc, "Not pre-allocating because %s can not run %s", child_node->details->uname, child->id); continue; } if ((local_node != NULL) && (local_node->count >= loop_max)) { pe_rsc_trace(rsc, "Not pre-allocating because %s already allocated " "optimal instances", child_node->details->uname); continue; } if (allocate_instance(child, child_node, all_coloc, per_host_max, data_set)) { pe_rsc_trace(rsc, "Pre-allocated %s to %s", child->id, child_node->details->uname); allocated++; } } pe_rsc_trace(rsc, "Done pre-allocating (%d of %d)", allocated, max); for (GList *gIter = children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *) gIter->data; if (child->running_on != NULL) { pe_node_t *child_node = pe__current_node(child); pe_node_t *local_node = pcmk__top_allowed_node(child, child_node); if (local_node == NULL) { crm_err("%s is running on %s which isn't allowed", child->id, child_node->details->uname); } } if (!pcmk_is_set(child->flags, pe_rsc_provisional)) { } else if (allocated >= max) { pe_rsc_debug(rsc, "Child %s not allocated - limit reached %d %d", child->id, allocated, max); resource_location(child, NULL, -INFINITY, "clone:limit_reached", data_set); } else { if (allocate_instance(child, NULL, all_coloc, per_host_max, data_set)) { allocated++; } } } pe_rsc_debug(rsc, "Allocated %d %s instances of a possible %d", allocated, rsc->id, max); } pe_node_t * pcmk__clone_allocate(pe_resource_t *rsc, pe_node_t *prefer, pe_working_set_t *data_set) { GList *nodes = NULL; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return NULL; } else if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { pe_rsc_debug(rsc, "Dependency loop detected involving %s", rsc->id); return NULL; } if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { pcmk__add_promotion_scores(rsc); } pe__set_resource_flags(rsc, pe_rsc_allocating); /* This information is used by pcmk__cmp_instance() when deciding the order * in which to assign clone instances to nodes. */ for (GList *gIter = rsc->rsc_cons; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; pe_rsc_trace(rsc, "%s: Allocating %s first", rsc->id, constraint->primary->id); constraint->primary->cmds->allocate(constraint->primary, prefer, data_set); } for (GList *gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; - if (!pcmk__colocation_has_influence(constraint, NULL)) { - continue; + if (pcmk__colocation_has_influence(constraint, NULL)) { + pcmk__apply_colocation(constraint, rsc, constraint->dependent, + pe_weights_rollback|pe_weights_positive); } - rsc->allowed_nodes = constraint->dependent->cmds->merge_weights( - constraint->dependent, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, (float)constraint->score / INFINITY, - (pe_weights_rollback | pe_weights_positive)); } pe__show_node_weights(!pcmk_is_set(data_set->flags, pe_flag_show_scores), rsc, __func__, rsc->allowed_nodes, data_set); nodes = g_hash_table_get_values(rsc->allowed_nodes); nodes = pcmk__sort_nodes(nodes, NULL, data_set); rsc->children = g_list_sort(rsc->children, pcmk__cmp_instance); distribute_children(rsc, rsc->children, nodes, clone_data->clone_max, clone_data->clone_node_max, data_set); g_list_free(nodes); if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { pcmk__set_instance_roles(rsc, data_set); } pe__clear_resource_flags(rsc, pe_rsc_provisional|pe_rsc_allocating); pe_rsc_trace(rsc, "Done allocating %s", rsc->id); return NULL; } static void clone_update_pseudo_status(pe_resource_t * rsc, gboolean * stopping, gboolean * starting, gboolean * active) { GList *gIter = NULL; if (rsc->children) { gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *) gIter->data; clone_update_pseudo_status(child, stopping, starting, active); } return; } CRM_ASSERT(active != NULL); CRM_ASSERT(starting != NULL); CRM_ASSERT(stopping != NULL); if (rsc->running_on) { *active = TRUE; } gIter = rsc->actions; for (; gIter != NULL; gIter = gIter->next) { pe_action_t *action = (pe_action_t *) gIter->data; if (*starting && *stopping) { return; } else if (pcmk_is_set(action->flags, pe_action_optional)) { pe_rsc_trace(rsc, "Skipping optional: %s", action->uuid); continue; } else if (!pcmk_any_flags_set(action->flags, pe_action_pseudo|pe_action_runnable)) { pe_rsc_trace(rsc, "Skipping unrunnable: %s", action->uuid); continue; } else if (pcmk__str_eq(RSC_STOP, action->task, pcmk__str_casei)) { pe_rsc_trace(rsc, "Stopping due to: %s", action->uuid); *stopping = TRUE; } else if (pcmk__str_eq(RSC_START, action->task, pcmk__str_casei)) { if (!pcmk_is_set(action->flags, pe_action_runnable)) { pe_rsc_trace(rsc, "Skipping pseudo-op: %s run=%d, pseudo=%d", action->uuid, pcmk_is_set(action->flags, pe_action_runnable), pcmk_is_set(action->flags, pe_action_pseudo)); } else { pe_rsc_trace(rsc, "Starting due to: %s", action->uuid); pe_rsc_trace(rsc, "%s run=%d, pseudo=%d", action->uuid, pcmk_is_set(action->flags, pe_action_runnable), pcmk_is_set(action->flags, pe_action_pseudo)); *starting = TRUE; } } } } static pe_action_t * find_rsc_action(pe_resource_t *rsc, const char *task) { pe_action_t *match = NULL; GList *actions = pe__resource_actions(rsc, NULL, task, FALSE); for (GList *item = actions; item != NULL; item = item->next) { pe_action_t *op = (pe_action_t *) item->data; if (!pcmk_is_set(op->flags, pe_action_optional)) { if (match != NULL) { // More than one match, don't return any match = NULL; break; } match = op; } } g_list_free(actions); return match; } static void child_ordering_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) { pe_action_t *stop = NULL; pe_action_t *start = NULL; pe_action_t *last_stop = NULL; pe_action_t *last_start = NULL; GList *gIter = NULL; if (!pe__clone_is_ordered(rsc)) { return; } /* we have to maintain a consistent sorted child list when building order constraints */ rsc->children = g_list_sort(rsc->children, pcmk__cmp_instance_number); for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *) gIter->data; stop = find_rsc_action(child, RSC_STOP); if (stop) { if (last_stop) { /* child/child relative stop */ order_actions(stop, last_stop, pe_order_optional); } last_stop = stop; } start = find_rsc_action(child, RSC_START); if (start) { if (last_start) { /* child/child relative start */ order_actions(last_start, start, pe_order_optional); } last_start = start; } } } void clone_create_actions(pe_resource_t *rsc, pe_working_set_t *data_set) { clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); clone_create_pseudo_actions(rsc, rsc->children, &clone_data->start_notify, &clone_data->stop_notify,data_set); child_ordering_constraints(rsc, data_set); if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { create_promotable_actions(rsc, data_set); } } void clone_create_pseudo_actions( pe_resource_t * rsc, GList *children, notify_data_t **start_notify, notify_data_t **stop_notify, pe_working_set_t * data_set) { gboolean child_active = FALSE; gboolean child_starting = FALSE; gboolean child_stopping = FALSE; gboolean allow_dependent_migrations = TRUE; pe_action_t *stop = NULL; pe_action_t *stopped = NULL; pe_action_t *start = NULL; pe_action_t *started = NULL; pe_rsc_trace(rsc, "Creating actions for %s", rsc->id); for (GList *gIter = children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; gboolean starting = FALSE; gboolean stopping = FALSE; child_rsc->cmds->create_actions(child_rsc, data_set); clone_update_pseudo_status(child_rsc, &stopping, &starting, &child_active); if (stopping && starting) { allow_dependent_migrations = FALSE; } child_stopping |= stopping; child_starting |= starting; } /* start */ start = pcmk__new_rsc_pseudo_action(rsc, RSC_START, !child_starting, true); started = pcmk__new_rsc_pseudo_action(rsc, RSC_STARTED, !child_starting, false); started->priority = INFINITY; if (child_active || child_starting) { pe__set_action_flags(started, pe_action_runnable); } if (start_notify != NULL && *start_notify == NULL) { *start_notify = pcmk__clone_notif_pseudo_ops(rsc, RSC_START, start, started); } /* stop */ stop = pcmk__new_rsc_pseudo_action(rsc, RSC_STOP, !child_stopping, true); stopped = pcmk__new_rsc_pseudo_action(rsc, RSC_STOPPED, !child_stopping, true); stopped->priority = INFINITY; if (allow_dependent_migrations) { pe__set_action_flags(stop, pe_action_migrate_runnable); } if (stop_notify != NULL && *stop_notify == NULL) { *stop_notify = pcmk__clone_notif_pseudo_ops(rsc, RSC_STOP, stop, stopped); if (start_notify && *start_notify && *stop_notify) { order_actions((*stop_notify)->post_done, (*start_notify)->pre, pe_order_optional); } } } void clone_internal_constraints(pe_resource_t *rsc, pe_working_set_t *data_set) { pe_resource_t *last_rsc = NULL; GList *gIter; bool ordered = pe__clone_is_ordered(rsc); pe_rsc_trace(rsc, "Internal constraints for %s", rsc->id); pcmk__order_resource_actions(rsc, RSC_STOPPED, rsc, RSC_START, pe_order_optional, data_set); pcmk__order_resource_actions(rsc, RSC_START, rsc, RSC_STARTED, pe_order_runnable_left, data_set); pcmk__order_resource_actions(rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_runnable_left, data_set); if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { pcmk__order_resource_actions(rsc, RSC_DEMOTED, rsc, RSC_STOP, pe_order_optional, data_set); pcmk__order_resource_actions(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_runnable_left, data_set); } if (ordered) { /* we have to maintain a consistent sorted child list when building order constraints */ rsc->children = g_list_sort(rsc->children, pcmk__cmp_instance_number); } for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->cmds->internal_constraints(child_rsc, data_set); pcmk__order_starts(rsc, child_rsc, pe_order_runnable_left|pe_order_implies_first_printed, data_set); pcmk__order_resource_actions(child_rsc, RSC_START, rsc, RSC_STARTED, pe_order_implies_then_printed, data_set); if (ordered && (last_rsc != NULL)) { pcmk__order_starts(last_rsc, child_rsc, pe_order_optional, data_set); } pcmk__order_stops(rsc, child_rsc, pe_order_implies_first_printed, data_set); pcmk__order_resource_actions(child_rsc, RSC_STOP, rsc, RSC_STOPPED, pe_order_implies_then_printed, data_set); if (ordered && (last_rsc != NULL)) { pcmk__order_stops(child_rsc, last_rsc, pe_order_optional, data_set); } last_rsc = child_rsc; } if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { promotable_constraints(rsc, data_set); } } gboolean is_child_compatible(pe_resource_t *child_rsc, pe_node_t * local_node, enum rsc_role_e filter, gboolean current) { pe_node_t *node = NULL; enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, current); CRM_CHECK(child_rsc && local_node, return FALSE); if (is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) { /* We only want instances that haven't failed */ node = child_rsc->fns->location(child_rsc, NULL, current); } if (filter != RSC_ROLE_UNKNOWN && next_role != filter) { crm_trace("Filtered %s", child_rsc->id); return FALSE; } if (node && (node->details == local_node->details)) { return TRUE; } else if (node) { crm_trace("%s - %s vs %s", child_rsc->id, node->details->uname, local_node->details->uname); } else { crm_trace("%s - not allocated %d", child_rsc->id, current); } return FALSE; } pe_resource_t * find_compatible_child(pe_resource_t *local_child, pe_resource_t *rsc, enum rsc_role_e filter, gboolean current, pe_working_set_t *data_set) { pe_resource_t *pair = NULL; GList *gIter = NULL; GList *scratch = NULL; pe_node_t *local_node = NULL; local_node = local_child->fns->location(local_child, NULL, current); if (local_node) { return find_compatible_child_by_node(local_child, local_node, rsc, filter, current); } scratch = g_hash_table_get_values(local_child->allowed_nodes); scratch = pcmk__sort_nodes(scratch, NULL, data_set); gIter = scratch; for (; gIter != NULL; gIter = gIter->next) { pe_node_t *node = (pe_node_t *) gIter->data; pair = find_compatible_child_by_node(local_child, node, rsc, filter, current); if (pair) { goto done; } } pe_rsc_debug(rsc, "Can't pair %s with %s", local_child->id, rsc->id); done: g_list_free(scratch); return pair; } void clone_rsc_colocation_lh(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, pe_working_set_t *data_set) { /* -- Never called -- * * Instead we add the colocation constraints to the child and call from there */ CRM_ASSERT(FALSE); } void clone_rsc_colocation_rh(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GList *gIter = NULL; gboolean do_interleave = FALSE; const char *interleave_s = NULL; CRM_CHECK(constraint != NULL, return); CRM_CHECK(dependent != NULL, pe_err("dependent was NULL for %s", constraint->id); return); CRM_CHECK(primary != NULL, pe_err("primary was NULL for %s", constraint->id); return); CRM_CHECK(dependent->variant == pe_native, return); pe_rsc_trace(primary, "Processing constraint %s: %s -> %s %d", constraint->id, dependent->id, primary->id, constraint->score); if (pcmk_is_set(primary->flags, pe_rsc_promotable)) { if (pcmk_is_set(primary->flags, pe_rsc_provisional)) { pe_rsc_trace(primary, "%s is still provisional", primary->id); return; } else if (constraint->primary_role == RSC_ROLE_UNKNOWN) { pe_rsc_trace(primary, "Handling %s as a clone colocation", constraint->id); } else { promotable_colocation_rh(dependent, primary, constraint, data_set); return; } } /* only the LHS side needs to be labeled as interleave */ interleave_s = g_hash_table_lookup(constraint->dependent->meta, XML_RSC_ATTR_INTERLEAVE); if (crm_is_true(interleave_s) && (constraint->dependent->variant > pe_group)) { /* @TODO Do we actually care about multiple primary copies sharing a * dependent copy anymore? */ if (copies_per_node(constraint->dependent) != copies_per_node(constraint->primary)) { pcmk__config_err("Cannot interleave %s and %s because they do not " "support the same number of instances per node", constraint->dependent->id, constraint->primary->id); } else { do_interleave = TRUE; } } if (pcmk_is_set(primary->flags, pe_rsc_provisional)) { pe_rsc_trace(primary, "%s is still provisional", primary->id); return; } else if (do_interleave) { pe_resource_t *primary_instance = NULL; primary_instance = find_compatible_child(dependent, primary, RSC_ROLE_UNKNOWN, FALSE, data_set); if (primary_instance != NULL) { pe_rsc_debug(primary, "Pairing %s with %s", dependent->id, primary_instance->id); dependent->cmds->rsc_colocation_lh(dependent, primary_instance, constraint, data_set); } else if (constraint->score >= INFINITY) { crm_notice("Cannot pair %s with instance of %s", dependent->id, primary->id); pcmk__assign_resource(dependent, NULL, true); } else { pe_rsc_debug(primary, "Cannot pair %s with instance of %s", dependent->id, primary->id); } return; } else if (constraint->score >= INFINITY) { GList *affected_nodes = NULL; gIter = primary->children; for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; pe_node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE); if (chosen != NULL && is_set_recursive(child_rsc, pe_rsc_block, TRUE) == FALSE) { pe_rsc_trace(primary, "Allowing %s: %s %d", constraint->id, chosen->details->uname, chosen->weight); affected_nodes = g_list_prepend(affected_nodes, chosen); } } node_list_exclude(dependent->allowed_nodes, affected_nodes, FALSE); g_list_free(affected_nodes); return; } gIter = primary->children; for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->cmds->rsc_colocation_rh(dependent, child_rsc, constraint, data_set); } } enum action_tasks clone_child_action(pe_action_t * action) { enum action_tasks result = no_action; pe_resource_t *child = (pe_resource_t *) action->rsc->children->data; if (pcmk__strcase_any_of(action->task, "notify", "notified", NULL)) { /* Find the action we're notifying about instead */ int stop = 0; char *key = action->uuid; int lpc = strlen(key); for (; lpc > 0; lpc--) { if (key[lpc] == '_' && stop == 0) { stop = lpc; } else if (key[lpc] == '_') { char *task_mutable = NULL; lpc++; task_mutable = strdup(key + lpc); task_mutable[stop - lpc] = 0; crm_trace("Extracted action '%s' from '%s'", task_mutable, key); result = get_complex_task(child, task_mutable, TRUE); free(task_mutable); break; } } } else { result = get_complex_task(child, action->task, TRUE); } return result; } #define pe__clear_action_summary_flags(flags, action, flag) do { \ flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ "Action summary", action->rsc->id, \ flags, flag, #flag); \ } while (0) enum pe_action_flags summary_action_flags(pe_action_t * action, GList *children, pe_node_t * node) { GList *gIter = NULL; gboolean any_runnable = FALSE; gboolean check_runnable = TRUE; enum action_tasks task = clone_child_action(action); enum pe_action_flags flags = (pe_action_optional | pe_action_runnable | pe_action_pseudo); const char *task_s = task2text(task); for (gIter = children; gIter != NULL; gIter = gIter->next) { pe_action_t *child_action = NULL; pe_resource_t *child = (pe_resource_t *) gIter->data; child_action = find_first_action(child->actions, NULL, task_s, child->children ? NULL : node); pe_rsc_trace(action->rsc, "Checking for %s in %s on %s (%s)", task_s, child->id, node ? node->details->uname : "none", child_action?child_action->uuid:"NA"); if (child_action) { enum pe_action_flags child_flags = child->cmds->action_flags(child_action, node); if (pcmk_is_set(flags, pe_action_optional) && !pcmk_is_set(child_flags, pe_action_optional)) { pe_rsc_trace(child, "%s is mandatory because of %s", action->uuid, child_action->uuid); pe__clear_action_summary_flags(flags, action, pe_action_optional); pe__clear_action_flags(action, pe_action_optional); } if (pcmk_is_set(child_flags, pe_action_runnable)) { any_runnable = TRUE; } } } if (check_runnable && any_runnable == FALSE) { pe_rsc_trace(action->rsc, "%s is not runnable because no children are", action->uuid); pe__clear_action_summary_flags(flags, action, pe_action_runnable); if (node == NULL) { pe__clear_action_flags(action, pe_action_runnable); } } return flags; } enum pe_action_flags clone_action_flags(pe_action_t * action, pe_node_t * node) { return summary_action_flags(action, action->rsc->children, node); } void clone_rsc_location(pe_resource_t *rsc, pe__location_t *constraint) { GList *gIter = rsc->children; pe_rsc_trace(rsc, "Processing location constraint %s for %s", constraint->id, rsc->id); pcmk__apply_location(constraint, rsc); for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->cmds->rsc_location(child_rsc, constraint); } } void clone_expand(pe_resource_t * rsc, pe_working_set_t * data_set) { GList *gIter = NULL; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); g_list_foreach(rsc->actions, (GFunc) rsc->cmds->action_flags, NULL); pcmk__create_notifications(rsc, clone_data->start_notify); pcmk__create_notifications(rsc, clone_data->stop_notify); pcmk__create_notifications(rsc, clone_data->promote_notify); pcmk__create_notifications(rsc, clone_data->demote_notify); /* Now that the notifcations have been created we can expand the children */ gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->cmds->expand(child_rsc, data_set); } native_expand(rsc, data_set); /* The notifications are in the graph now, we can destroy the notify_data */ pcmk__free_notification_data(clone_data->demote_notify); clone_data->demote_notify = NULL; pcmk__free_notification_data(clone_data->stop_notify); clone_data->stop_notify = NULL; pcmk__free_notification_data(clone_data->start_notify); clone_data->start_notify = NULL; pcmk__free_notification_data(clone_data->promote_notify); clone_data->promote_notify = NULL; } // Check whether a resource or any of its children is known on node static bool rsc_known_on(const pe_resource_t *rsc, const pe_node_t *node) { if (rsc->children) { for (GList *child_iter = rsc->children; child_iter != NULL; child_iter = child_iter->next) { pe_resource_t *child = (pe_resource_t *) child_iter->data; if (rsc_known_on(child, node)) { return TRUE; } } } else if (rsc->known_on) { GHashTableIter iter; pe_node_t *known_node = NULL; g_hash_table_iter_init(&iter, rsc->known_on); while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &known_node)) { if (node->details == known_node->details) { return TRUE; } } } return FALSE; } // Look for an instance of clone that is known on node static pe_resource_t * find_instance_on(const pe_resource_t *clone, const pe_node_t *node) { for (GList *gIter = clone->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *) gIter->data; if (rsc_known_on(child, node)) { return child; } } return NULL; } // For unique clones, probe each instance separately static gboolean probe_unique_clone(pe_resource_t *rsc, pe_node_t *node, pe_action_t *complete, gboolean force, pe_working_set_t *data_set) { gboolean any_created = FALSE; for (GList *child_iter = rsc->children; child_iter != NULL; child_iter = child_iter->next) { pe_resource_t *child = (pe_resource_t *) child_iter->data; any_created |= child->cmds->create_probe(child, node, complete, force, data_set); } return any_created; } // For anonymous clones, only a single instance needs to be probed static gboolean probe_anonymous_clone(pe_resource_t *rsc, pe_node_t *node, pe_action_t *complete, gboolean force, pe_working_set_t *data_set) { // First, check if we probed an instance on this node last time pe_resource_t *child = find_instance_on(rsc, node); // Otherwise, check if we plan to start an instance on this node if (child == NULL) { for (GList *child_iter = rsc->children; child_iter && !child; child_iter = child_iter->next) { pe_node_t *local_node = NULL; pe_resource_t *child_rsc = (pe_resource_t *) child_iter->data; if (child_rsc) { /* make clang analyzer happy */ local_node = child_rsc->fns->location(child_rsc, NULL, FALSE); if (local_node && (local_node->details == node->details)) { child = child_rsc; } } } } // Otherwise, use the first clone instance if (child == NULL) { child = rsc->children->data; } CRM_ASSERT(child); return child->cmds->create_probe(child, node, complete, force, data_set); } gboolean clone_create_probe(pe_resource_t * rsc, pe_node_t * node, pe_action_t * complete, gboolean force, pe_working_set_t * data_set) { gboolean any_created = FALSE; CRM_ASSERT(rsc); rsc->children = g_list_sort(rsc->children, pcmk__cmp_instance_number); if (rsc->children == NULL) { pe_warn("Clone %s has no children", rsc->id); return FALSE; } if (rsc->exclusive_discover) { pe_node_t *allowed = g_hash_table_lookup(rsc->allowed_nodes, node->details->id); if (allowed && allowed->rsc_discover_mode != pe_discover_exclusive) { /* exclusive discover is enabled and this node is not marked * as a node this resource should be discovered on * * remove the node from allowed_nodes so that the * notification contains only nodes that we might ever run * on */ g_hash_table_remove(rsc->allowed_nodes, node->details->id); /* Bit of a shortcut - might as well take it */ return FALSE; } } if (pcmk_is_set(rsc->flags, pe_rsc_unique)) { any_created = probe_unique_clone(rsc, node, complete, force, data_set); } else { any_created = probe_anonymous_clone(rsc, node, complete, force, data_set); } return any_created; } void clone_append_meta(pe_resource_t * rsc, xmlNode * xml) { char *name = NULL; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); name = crm_meta_name(XML_RSC_ATTR_UNIQUE); crm_xml_add(xml, name, pe__rsc_bool_str(rsc, pe_rsc_unique)); free(name); name = crm_meta_name(XML_RSC_ATTR_NOTIFY); crm_xml_add(xml, name, pe__rsc_bool_str(rsc, pe_rsc_notify)); free(name); name = crm_meta_name(XML_RSC_ATTR_INCARNATION_MAX); crm_xml_add_int(xml, name, clone_data->clone_max); free(name); name = crm_meta_name(XML_RSC_ATTR_INCARNATION_NODEMAX); crm_xml_add_int(xml, name, clone_data->clone_node_max); free(name); if (pcmk_is_set(rsc->flags, pe_rsc_promotable)) { name = crm_meta_name(XML_RSC_ATTR_PROMOTED_MAX); crm_xml_add_int(xml, name, clone_data->promoted_max); free(name); name = crm_meta_name(XML_RSC_ATTR_PROMOTED_NODEMAX); crm_xml_add_int(xml, name, clone_data->promoted_node_max); free(name); /* @COMPAT Maintain backward compatibility with resource agents that * expect the old names (deprecated since 2.0.0). */ name = crm_meta_name(PCMK_XE_PROMOTED_MAX_LEGACY); crm_xml_add_int(xml, name, clone_data->promoted_max); free(name); name = crm_meta_name(PCMK_XE_PROMOTED_NODE_MAX_LEGACY); crm_xml_add_int(xml, name, clone_data->promoted_node_max); free(name); } } // Clone implementation of resource_alloc_functions_t:add_utilization() void pcmk__clone_add_utilization(pe_resource_t *rsc, pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization) { bool existing = false; pe_resource_t *child = NULL; if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return; } // Look for any child already existing in the list for (GList *iter = rsc->children; iter != NULL; iter = iter->next) { child = (pe_resource_t *) iter->data; if (g_list_find(all_rscs, child)) { existing = true; // Keep checking remaining children } else { // If this is a clone of a group, look for group's members for (GList *member_iter = child->children; member_iter != NULL; member_iter = member_iter->next) { pe_resource_t *member = (pe_resource_t *) member_iter->data; if (g_list_find(all_rscs, member) != NULL) { // Add *child's* utilization, not group member's child->cmds->add_utilization(child, orig_rsc, all_rscs, utilization); existing = true; break; } } } } if (!existing && (rsc->children != NULL)) { // If nothing was found, still add first child's utilization child = (pe_resource_t *) rsc->children->data; child->cmds->add_utilization(child, orig_rsc, all_rscs, utilization); } } // Clone implementation of resource_alloc_functions_t:shutdown_lock() void pcmk__clone_shutdown_lock(pe_resource_t *rsc) { return; // Clones currently don't support shutdown locks } diff --git a/lib/pacemaker/pcmk_sched_colocation.c b/lib/pacemaker/pcmk_sched_colocation.c index 6017c43e5c..bce291ab78 100644 --- a/lib/pacemaker/pcmk_sched_colocation.c +++ b/lib/pacemaker/pcmk_sched_colocation.c @@ -1,1065 +1,1087 @@ /* * Copyright 2004-2022 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. */ #include #include #include #include #include #include #include "crm/common/util.h" #include "crm/common/xml_internal.h" #include "crm/msg_xml.h" #include "libpacemaker_private.h" #define EXPAND_CONSTRAINT_IDREF(__set, __rsc, __name) do { \ __rsc = pcmk__find_constraint_resource(data_set->resources, __name); \ if (__rsc == NULL) { \ pcmk__config_err("%s: No resource found for %s", __set, __name); \ return; \ } \ } while(0) static gint cmp_dependent_priority(gconstpointer a, gconstpointer b) { const pcmk__colocation_t *rsc_constraint1 = (const pcmk__colocation_t *) a; const pcmk__colocation_t *rsc_constraint2 = (const pcmk__colocation_t *) b; if (a == NULL) { return 1; } if (b == NULL) { return -1; } CRM_ASSERT(rsc_constraint1->dependent != NULL); CRM_ASSERT(rsc_constraint1->primary != NULL); if (rsc_constraint1->dependent->priority > rsc_constraint2->dependent->priority) { return -1; } if (rsc_constraint1->dependent->priority < rsc_constraint2->dependent->priority) { return 1; } /* Process clones before primitives and groups */ if (rsc_constraint1->dependent->variant > rsc_constraint2->dependent->variant) { return -1; } if (rsc_constraint1->dependent->variant < rsc_constraint2->dependent->variant) { return 1; } /* @COMPAT scheduler <2.0.0: Process promotable clones before nonpromotable * clones (probably unnecessary, but avoids having to update regression * tests) */ if (rsc_constraint1->dependent->variant == pe_clone) { if (pcmk_is_set(rsc_constraint1->dependent->flags, pe_rsc_promotable) && !pcmk_is_set(rsc_constraint2->dependent->flags, pe_rsc_promotable)) { return -1; } else if (!pcmk_is_set(rsc_constraint1->dependent->flags, pe_rsc_promotable) && pcmk_is_set(rsc_constraint2->dependent->flags, pe_rsc_promotable)) { return 1; } } return strcmp(rsc_constraint1->dependent->id, rsc_constraint2->dependent->id); } static gint cmp_primary_priority(gconstpointer a, gconstpointer b) { const pcmk__colocation_t *rsc_constraint1 = (const pcmk__colocation_t *) a; const pcmk__colocation_t *rsc_constraint2 = (const pcmk__colocation_t *) b; if (a == NULL) { return 1; } if (b == NULL) { return -1; } CRM_ASSERT(rsc_constraint1->dependent != NULL); CRM_ASSERT(rsc_constraint1->primary != NULL); if (rsc_constraint1->primary->priority > rsc_constraint2->primary->priority) { return -1; } if (rsc_constraint1->primary->priority < rsc_constraint2->primary->priority) { return 1; } /* Process clones before primitives and groups */ if (rsc_constraint1->primary->variant > rsc_constraint2->primary->variant) { return -1; } else if (rsc_constraint1->primary->variant < rsc_constraint2->primary->variant) { return 1; } /* @COMPAT scheduler <2.0.0: Process promotable clones before nonpromotable * clones (probably unnecessary, but avoids having to update regression * tests) */ if (rsc_constraint1->primary->variant == pe_clone) { if (pcmk_is_set(rsc_constraint1->primary->flags, pe_rsc_promotable) && !pcmk_is_set(rsc_constraint2->primary->flags, pe_rsc_promotable)) { return -1; } else if (!pcmk_is_set(rsc_constraint1->primary->flags, pe_rsc_promotable) && pcmk_is_set(rsc_constraint2->primary->flags, pe_rsc_promotable)) { return 1; } } return strcmp(rsc_constraint1->primary->id, rsc_constraint2->primary->id); } /*! * \internal * \brief Add orderings necessary for an anti-colocation constraint */ static void anti_colocation_order(pe_resource_t *first_rsc, int first_role, pe_resource_t *then_rsc, int then_role, pe_working_set_t *data_set) { const char *first_tasks[] = { NULL, NULL }; const char *then_tasks[] = { NULL, NULL }; /* Actions to make first_rsc lose first_role */ if (first_role == RSC_ROLE_PROMOTED) { first_tasks[0] = CRMD_ACTION_DEMOTE; } else { first_tasks[0] = CRMD_ACTION_STOP; if (first_role == RSC_ROLE_UNPROMOTED) { first_tasks[1] = CRMD_ACTION_PROMOTE; } } /* Actions to make then_rsc gain then_role */ if (then_role == RSC_ROLE_PROMOTED) { then_tasks[0] = CRMD_ACTION_PROMOTE; } else { then_tasks[0] = CRMD_ACTION_START; if (then_role == RSC_ROLE_UNPROMOTED) { then_tasks[1] = CRMD_ACTION_DEMOTE; } } for (int first_lpc = 0; (first_lpc <= 1) && (first_tasks[first_lpc] != NULL); first_lpc++) { for (int then_lpc = 0; (then_lpc <= 1) && (then_tasks[then_lpc] != NULL); then_lpc++) { pcmk__order_resource_actions(first_rsc, first_tasks[first_lpc], then_rsc, then_tasks[then_lpc], pe_order_anti_colocation, data_set); } } } /*! * \internal * \brief Add a new colocation constraint to a cluster working set * * \param[in] id XML ID for this constraint * \param[in] node_attr Colocate by this attribute (or NULL for #uname) * \param[in] score Constraint score * \param[in] dependent Resource to be colocated * \param[in] primary Resource to colocate \p dependent with * \param[in] dependent_role Current role of \p dependent * \param[in] primary_role Current role of \p primary * \param[in] influence Whether colocation constraint has influence * \param[in] data_set Cluster working set to add constraint to */ void pcmk__new_colocation(const char *id, const char *node_attr, int score, pe_resource_t *dependent, pe_resource_t *primary, const char *dependent_role, const char *primary_role, bool influence, pe_working_set_t *data_set) { pcmk__colocation_t *new_con = NULL; if (score == 0) { crm_trace("Ignoring colocation '%s' because score is 0", id); return; } if ((dependent == NULL) || (primary == NULL)) { pcmk__config_err("Ignoring colocation '%s' because resource " "does not exist", id); return; } new_con = calloc(1, sizeof(pcmk__colocation_t)); if (new_con == NULL) { return; } if (pcmk__str_eq(dependent_role, RSC_ROLE_STARTED_S, pcmk__str_null_matches|pcmk__str_casei)) { dependent_role = RSC_ROLE_UNKNOWN_S; } if (pcmk__str_eq(primary_role, RSC_ROLE_STARTED_S, pcmk__str_null_matches|pcmk__str_casei)) { primary_role = RSC_ROLE_UNKNOWN_S; } new_con->id = id; new_con->dependent = dependent; new_con->primary = primary; new_con->score = score; new_con->dependent_role = text2role(dependent_role); new_con->primary_role = text2role(primary_role); new_con->node_attribute = node_attr; new_con->influence = influence; if (node_attr == NULL) { node_attr = CRM_ATTR_UNAME; } pe_rsc_trace(dependent, "%s ==> %s (%s %d)", dependent->id, primary->id, node_attr, score); dependent->rsc_cons = g_list_insert_sorted(dependent->rsc_cons, new_con, cmp_primary_priority); primary->rsc_cons_lhs = g_list_insert_sorted(primary->rsc_cons_lhs, new_con, cmp_dependent_priority); data_set->colocation_constraints = g_list_append(data_set->colocation_constraints, new_con); if (score <= -INFINITY) { anti_colocation_order(dependent, new_con->dependent_role, primary, new_con->primary_role, data_set); anti_colocation_order(primary, new_con->primary_role, dependent, new_con->dependent_role, data_set); } } /*! * \internal * \brief Return the boolean influence corresponding to configuration * * \param[in] coloc_id Colocation XML ID (for error logging) * \param[in] rsc Resource involved in constraint (for default) * \param[in] influence_s String value of influence option * * \return true if string evaluates true, false if string evaluates false, * or value of resource's critical option if string is NULL or invalid */ static bool unpack_influence(const char *coloc_id, const pe_resource_t *rsc, const char *influence_s) { if (influence_s != NULL) { int influence_i = 0; if (crm_str_to_boolean(influence_s, &influence_i) < 0) { pcmk__config_err("Constraint '%s' has invalid value for " XML_COLOC_ATTR_INFLUENCE " (using default)", coloc_id); } else { return (influence_i != 0); } } return pcmk_is_set(rsc->flags, pe_rsc_critical); } static void unpack_colocation_set(xmlNode *set, int score, const char *coloc_id, const char *influence_s, pe_working_set_t *data_set) { xmlNode *xml_rsc = NULL; pe_resource_t *with = NULL; pe_resource_t *resource = NULL; const char *set_id = ID(set); const char *role = crm_element_value(set, "role"); const char *ordering = crm_element_value(set, "ordering"); int local_score = score; bool sequential = false; const char *score_s = crm_element_value(set, XML_RULE_ATTR_SCORE); if (score_s) { local_score = char2score(score_s); } if (local_score == 0) { crm_trace("Ignoring colocation '%s' for set '%s' because score is 0", coloc_id, set_id); return; } if (ordering == NULL) { ordering = "group"; } if (pcmk__xe_get_bool_attr(set, "sequential", &sequential) == pcmk_rc_ok && !sequential) { return; } else if ((local_score > 0) && pcmk__str_eq(ordering, "group", pcmk__str_casei)) { for (xml_rsc = first_named_child(set, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { EXPAND_CONSTRAINT_IDREF(set_id, resource, ID(xml_rsc)); if (with != NULL) { pe_rsc_trace(resource, "Colocating %s with %s", resource->id, with->id); pcmk__new_colocation(set_id, NULL, local_score, resource, with, role, role, unpack_influence(coloc_id, resource, influence_s), data_set); } with = resource; } } else if (local_score > 0) { pe_resource_t *last = NULL; for (xml_rsc = first_named_child(set, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { EXPAND_CONSTRAINT_IDREF(set_id, resource, ID(xml_rsc)); if (last != NULL) { pe_rsc_trace(resource, "Colocating %s with %s", last->id, resource->id); pcmk__new_colocation(set_id, NULL, local_score, last, resource, role, role, unpack_influence(coloc_id, last, influence_s), data_set); } last = resource; } } else { /* Anti-colocating with every prior resource is * the only way to ensure the intuitive result * (i.e. that no one in the set can run with anyone else in the set) */ for (xml_rsc = first_named_child(set, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { xmlNode *xml_rsc_with = NULL; bool influence = true; EXPAND_CONSTRAINT_IDREF(set_id, resource, ID(xml_rsc)); influence = unpack_influence(coloc_id, resource, influence_s); for (xml_rsc_with = first_named_child(set, XML_TAG_RESOURCE_REF); xml_rsc_with != NULL; xml_rsc_with = crm_next_same_xml(xml_rsc_with)) { if (pcmk__str_eq(resource->id, ID(xml_rsc_with), pcmk__str_casei)) { break; } EXPAND_CONSTRAINT_IDREF(set_id, with, ID(xml_rsc_with)); pe_rsc_trace(resource, "Anti-Colocating %s with %s", resource->id, with->id); pcmk__new_colocation(set_id, NULL, local_score, resource, with, role, role, influence, data_set); } } } } static void colocate_rsc_sets(const char *id, xmlNode *set1, xmlNode *set2, int score, const char *influence_s, pe_working_set_t *data_set) { xmlNode *xml_rsc = NULL; pe_resource_t *rsc_1 = NULL; pe_resource_t *rsc_2 = NULL; const char *role_1 = crm_element_value(set1, "role"); const char *role_2 = crm_element_value(set2, "role"); int rc = pcmk_rc_ok; bool sequential = false; if (score == 0) { crm_trace("Ignoring colocation '%s' between sets because score is 0", id); return; } rc = pcmk__xe_get_bool_attr(set1, "sequential", &sequential); if (rc != pcmk_rc_ok || sequential) { // Get the first one xml_rsc = first_named_child(set1, XML_TAG_RESOURCE_REF); if (xml_rsc != NULL) { EXPAND_CONSTRAINT_IDREF(id, rsc_1, ID(xml_rsc)); } } rc = pcmk__xe_get_bool_attr(set2, "sequential", &sequential); if (rc != pcmk_rc_ok || sequential) { // Get the last one const char *rid = NULL; for (xml_rsc = first_named_child(set2, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { rid = ID(xml_rsc); } EXPAND_CONSTRAINT_IDREF(id, rsc_2, rid); } if ((rsc_1 != NULL) && (rsc_2 != NULL)) { pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, role_2, unpack_influence(id, rsc_1, influence_s), data_set); } else if (rsc_1 != NULL) { bool influence = unpack_influence(id, rsc_1, influence_s); for (xml_rsc = first_named_child(set2, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { EXPAND_CONSTRAINT_IDREF(id, rsc_2, ID(xml_rsc)); pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, role_2, influence, data_set); } } else if (rsc_2 != NULL) { for (xml_rsc = first_named_child(set1, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { EXPAND_CONSTRAINT_IDREF(id, rsc_1, ID(xml_rsc)); pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, role_2, unpack_influence(id, rsc_1, influence_s), data_set); } } else { for (xml_rsc = first_named_child(set1, XML_TAG_RESOURCE_REF); xml_rsc != NULL; xml_rsc = crm_next_same_xml(xml_rsc)) { xmlNode *xml_rsc_2 = NULL; bool influence = true; EXPAND_CONSTRAINT_IDREF(id, rsc_1, ID(xml_rsc)); influence = unpack_influence(id, rsc_1, influence_s); for (xml_rsc_2 = first_named_child(set2, XML_TAG_RESOURCE_REF); xml_rsc_2 != NULL; xml_rsc_2 = crm_next_same_xml(xml_rsc_2)) { EXPAND_CONSTRAINT_IDREF(id, rsc_2, ID(xml_rsc_2)); pcmk__new_colocation(id, NULL, score, rsc_1, rsc_2, role_1, role_2, influence, data_set); } } } } static void unpack_simple_colocation(xmlNode *xml_obj, const char *id, const char *influence_s, pe_working_set_t *data_set) { int score_i = 0; const char *score = crm_element_value(xml_obj, XML_RULE_ATTR_SCORE); const char *dependent_id = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE); const char *primary_id = crm_element_value(xml_obj, XML_COLOC_ATTR_TARGET); const char *dependent_role = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE_ROLE); const char *primary_role = crm_element_value(xml_obj, XML_COLOC_ATTR_TARGET_ROLE); const char *attr = crm_element_value(xml_obj, XML_COLOC_ATTR_NODE_ATTR); // experimental syntax from pacemaker-next (unlikely to be adopted as-is) const char *dependent_instance = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE_INSTANCE); const char *primary_instance = crm_element_value(xml_obj, XML_COLOC_ATTR_TARGET_INSTANCE); pe_resource_t *dependent = pcmk__find_constraint_resource(data_set->resources, dependent_id); pe_resource_t *primary = pcmk__find_constraint_resource(data_set->resources, primary_id); if (dependent == NULL) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "does not exist", id, dependent_id); return; } else if (primary == NULL) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "does not exist", id, primary_id); return; } else if ((dependent_instance != NULL) && !pe_rsc_is_clone(dependent)) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "is not a clone but instance '%s' was requested", id, dependent_id, dependent_instance); return; } else if ((primary_instance != NULL) && !pe_rsc_is_clone(primary)) { pcmk__config_err("Ignoring constraint '%s' because resource '%s' " "is not a clone but instance '%s' was requested", id, primary_id, primary_instance); return; } if (dependent_instance != NULL) { dependent = find_clone_instance(dependent, dependent_instance, data_set); if (dependent == NULL) { pcmk__config_warn("Ignoring constraint '%s' because resource '%s' " "does not have an instance '%s'", id, dependent_id, dependent_instance); return; } } if (primary_instance != NULL) { primary = find_clone_instance(primary, primary_instance, data_set); if (primary == NULL) { pcmk__config_warn("Ignoring constraint '%s' because resource '%s' " "does not have an instance '%s'", "'%s'", id, primary_id, primary_instance); return; } } if (pcmk__xe_attr_is_true(xml_obj, XML_CONS_ATTR_SYMMETRICAL)) { pcmk__config_warn("The colocation constraint '" XML_CONS_ATTR_SYMMETRICAL "' attribute has been removed"); } if (score) { score_i = char2score(score); } pcmk__new_colocation(id, attr, score_i, dependent, primary, dependent_role, primary_role, unpack_influence(id, dependent, influence_s), data_set); } // \return Standard Pacemaker return code static int unpack_colocation_tags(xmlNode *xml_obj, xmlNode **expanded_xml, pe_working_set_t *data_set) { const char *id = NULL; const char *dependent_id = NULL; const char *primary_id = NULL; const char *dependent_role = NULL; const char *primary_role = NULL; pe_resource_t *dependent = NULL; pe_resource_t *primary = NULL; pe_tag_t *dependent_tag = NULL; pe_tag_t *primary_tag = NULL; xmlNode *dependent_set = NULL; xmlNode *primary_set = NULL; bool any_sets = false; *expanded_xml = NULL; CRM_CHECK(xml_obj != NULL, return pcmk_rc_schema_validation); id = ID(xml_obj); if (id == NULL) { pcmk__config_err("Ignoring <%s> constraint without " XML_ATTR_ID, crm_element_name(xml_obj)); return pcmk_rc_schema_validation; } // Check whether there are any resource sets with template or tag references *expanded_xml = pcmk__expand_tags_in_sets(xml_obj, data_set); if (*expanded_xml != NULL) { crm_log_xml_trace(*expanded_xml, "Expanded rsc_colocation"); return pcmk_rc_ok; } dependent_id = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE); primary_id = crm_element_value(xml_obj, XML_COLOC_ATTR_TARGET); if ((dependent_id == NULL) || (primary_id == NULL)) { return pcmk_rc_ok; } if (!pcmk__valid_resource_or_tag(data_set, dependent_id, &dependent, &dependent_tag)) { pcmk__config_err("Ignoring constraint '%s' because '%s' is not a " "valid resource or tag", id, dependent_id); return pcmk_rc_schema_validation; } if (!pcmk__valid_resource_or_tag(data_set, primary_id, &primary, &primary_tag)) { pcmk__config_err("Ignoring constraint '%s' because '%s' is not a " "valid resource or tag", id, primary_id); return pcmk_rc_schema_validation; } if ((dependent != NULL) && (primary != NULL)) { /* Neither side references any template/tag. */ return pcmk_rc_ok; } if ((dependent_tag != NULL) && (primary_tag != NULL)) { // A colocation constraint between two templates/tags makes no sense pcmk__config_err("Ignoring constraint '%s' because two templates or " "tags cannot be colocated", id); return pcmk_rc_schema_validation; } dependent_role = crm_element_value(xml_obj, XML_COLOC_ATTR_SOURCE_ROLE); primary_role = crm_element_value(xml_obj, XML_COLOC_ATTR_TARGET_ROLE); *expanded_xml = copy_xml(xml_obj); // Convert template/tag reference in "rsc" into resource_set under constraint if (!pcmk__tag_to_set(*expanded_xml, &dependent_set, XML_COLOC_ATTR_SOURCE, true, data_set)) { free_xml(*expanded_xml); *expanded_xml = NULL; return pcmk_rc_schema_validation; } if (dependent_set != NULL) { if (dependent_role != NULL) { // Move "rsc-role" into converted resource_set as "role" crm_xml_add(dependent_set, "role", dependent_role); xml_remove_prop(*expanded_xml, XML_COLOC_ATTR_SOURCE_ROLE); } any_sets = true; } // Convert template/tag reference in "with-rsc" into resource_set under constraint if (!pcmk__tag_to_set(*expanded_xml, &primary_set, XML_COLOC_ATTR_TARGET, true, data_set)) { free_xml(*expanded_xml); *expanded_xml = NULL; return pcmk_rc_schema_validation; } if (primary_set != NULL) { if (primary_role != NULL) { // Move "with-rsc-role" into converted resource_set as "role" crm_xml_add(primary_set, "role", primary_role); xml_remove_prop(*expanded_xml, XML_COLOC_ATTR_TARGET_ROLE); } any_sets = true; } if (any_sets) { crm_log_xml_trace(*expanded_xml, "Expanded rsc_colocation"); } else { free_xml(*expanded_xml); *expanded_xml = NULL; } return pcmk_rc_ok; } /*! * \internal * \brief Parse a colocation constraint from XML into a cluster working set * * \param[in] xml_obj Colocation constraint XML to unpack * \param[in] data_set Cluster working set to add constraint to */ void pcmk__unpack_colocation(xmlNode *xml_obj, pe_working_set_t *data_set) { int score_i = 0; xmlNode *set = NULL; xmlNode *last = NULL; xmlNode *orig_xml = NULL; xmlNode *expanded_xml = NULL; const char *id = crm_element_value(xml_obj, XML_ATTR_ID); const char *score = crm_element_value(xml_obj, XML_RULE_ATTR_SCORE); const char *influence_s = crm_element_value(xml_obj, XML_COLOC_ATTR_INFLUENCE); if (score) { score_i = char2score(score); } if (unpack_colocation_tags(xml_obj, &expanded_xml, data_set) != pcmk_rc_ok) { return; } if (expanded_xml) { orig_xml = xml_obj; xml_obj = expanded_xml; } for (set = first_named_child(xml_obj, XML_CONS_TAG_RSC_SET); set != NULL; set = crm_next_same_xml(set)) { set = expand_idref(set, data_set->input); if (set == NULL) { // Configuration error, message already logged if (expanded_xml != NULL) { free_xml(expanded_xml); } return; } unpack_colocation_set(set, score_i, id, influence_s, data_set); if (last != NULL) { colocate_rsc_sets(id, last, set, score_i, influence_s, data_set); } last = set; } if (expanded_xml) { free_xml(expanded_xml); xml_obj = orig_xml; } if (last == NULL) { unpack_simple_colocation(xml_obj, id, influence_s, data_set); } } static void mark_start_blocked(pe_resource_t *rsc, pe_resource_t *reason, pe_working_set_t *data_set) { char *reason_text = crm_strdup_printf("colocation with %s", reason->id); for (GList *gIter = rsc->actions; gIter != NULL; gIter = gIter->next) { pe_action_t *action = (pe_action_t *) gIter->data; if (pcmk_is_set(action->flags, pe_action_runnable) && pcmk__str_eq(action->task, RSC_START, pcmk__str_casei)) { pe__clear_action_flags(action, pe_action_runnable); pe_action_set_reason(action, reason_text, false); pcmk__block_colocated_starts(action, data_set); pcmk__update_action_for_orderings(action, data_set); } } free(reason_text); } /*! * \internal * \brief If a start action is unrunnable, block starts of colocated resources * * \param[in] action Action to check * \param[in] data_set Cluster working set */ void pcmk__block_colocated_starts(pe_action_t *action, pe_working_set_t *data_set) { GList *gIter = NULL; pe_resource_t *rsc = NULL; if (!pcmk_is_set(action->flags, pe_action_runnable) && pcmk__str_eq(action->task, RSC_START, pcmk__str_casei)) { rsc = uber_parent(action->rsc); if (rsc->parent) { /* For bundles, uber_parent() returns the clone, not the bundle, so * the existence of rsc->parent implies this is a bundle. * In this case, we need the bundle resource, so that we can check * if all containers are stopped/stopping. */ rsc = rsc->parent; } } if ((rsc == NULL) || (rsc->rsc_cons_lhs == NULL)) { return; } // Block colocated starts only if all children (if any) have unrunnable starts for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child = (pe_resource_t *)gIter->data; pe_action_t *start = find_first_action(child->actions, NULL, RSC_START, NULL); if ((start == NULL) || pcmk_is_set(start->flags, pe_action_runnable)) { return; } } for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *colocate_with = (pcmk__colocation_t *) gIter->data; if (colocate_with->score == INFINITY) { mark_start_blocked(colocate_with->dependent, action->rsc, data_set); } } } /*! * \internal * \brief Determine how a colocation constraint should affect a resource * * Colocation constraints have different effects at different points in the * scheduler sequence. Initially, they affect a resource's location; once that * is determined, then for promotable clones they can affect a resource * instance's role; after both are determined, the constraints no longer matter. * Given a specific colocation constraint, check what has been done so far to * determine what should be affected at the current point in the scheduler. * * \param[in] dependent Dependent resource in colocation * \param[in] primary Primary resource in colocation * \param[in] constraint Colocation constraint * \param[in] preview If true, pretend resources have already been allocated * * \return How colocation constraint should be applied at this point */ enum pcmk__coloc_affects pcmk__colocation_affects(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, bool preview) { if (!preview && pcmk_is_set(primary->flags, pe_rsc_provisional)) { // Primary resource has not been allocated yet, so we can't do anything return pcmk__coloc_affects_nothing; } if ((constraint->dependent_role >= RSC_ROLE_UNPROMOTED) && (dependent->parent != NULL) && pcmk_is_set(dependent->parent->flags, pe_rsc_promotable) && !pcmk_is_set(dependent->flags, pe_rsc_provisional)) { /* This is a colocation by role, and the dependent is a promotable clone * that has already been allocated, so the colocation should now affect * the role. */ return pcmk__coloc_affects_role; } if (!preview && !pcmk_is_set(dependent->flags, pe_rsc_provisional)) { /* The dependent resource has already been through allocation, so the * constraint no longer has any effect. Log an error if a mandatory * colocation constraint has been violated. */ const pe_node_t *primary_node = primary->allocated_to; if (dependent->allocated_to == NULL) { crm_trace("Skipping colocation '%s': %s will not run anywhere", constraint->id, dependent->id); } else if (constraint->score >= INFINITY) { // Dependent resource must colocate with primary resource if ((primary_node == NULL) || (primary_node->details != dependent->allocated_to->details)) { crm_err("%s must be colocated with %s but is not (%s vs. %s)", dependent->id, primary->id, dependent->allocated_to->details->uname, (primary_node == NULL)? "unallocated" : primary_node->details->uname); } } else if (constraint->score <= -CRM_SCORE_INFINITY) { // Dependent resource must anti-colocate with primary resource if ((primary_node != NULL) && (dependent->allocated_to->details == primary_node->details)) { crm_err("%s and %s must be anti-colocated but are allocated " "to the same node (%s)", dependent->id, primary->id, primary_node->details->uname); } } return pcmk__coloc_affects_nothing; } if ((constraint->score > 0) && (constraint->dependent_role != RSC_ROLE_UNKNOWN) && (constraint->dependent_role != dependent->next_role)) { crm_trace("Skipping colocation '%s': dependent limited to %s role " "but %s next role is %s", constraint->id, role2text(constraint->dependent_role), dependent->id, role2text(dependent->next_role)); return pcmk__coloc_affects_nothing; } if ((constraint->score > 0) && (constraint->primary_role != RSC_ROLE_UNKNOWN) && (constraint->primary_role != primary->next_role)) { crm_trace("Skipping colocation '%s': primary limited to %s role " "but %s next role is %s", constraint->id, role2text(constraint->primary_role), primary->id, role2text(primary->next_role)); return pcmk__coloc_affects_nothing; } if ((constraint->score < 0) && (constraint->dependent_role != RSC_ROLE_UNKNOWN) && (constraint->dependent_role == dependent->next_role)) { crm_trace("Skipping anti-colocation '%s': dependent role %s matches", constraint->id, role2text(constraint->dependent_role)); return pcmk__coloc_affects_nothing; } if ((constraint->score < 0) && (constraint->primary_role != RSC_ROLE_UNKNOWN) && (constraint->primary_role == primary->next_role)) { crm_trace("Skipping anti-colocation '%s': primary role %s matches", constraint->id, role2text(constraint->primary_role)); return pcmk__coloc_affects_nothing; } return pcmk__coloc_affects_location; } /*! * \internal * \brief Apply colocation to dependent for allocation purposes * * Update the allocated node weights of the dependent resource in a colocation, * for the purposes of allocating it to a node * * \param[in] dependent Dependent resource in colocation * \param[in] primary Primary resource in colocation * \param[in] constraint Colocation constraint */ void pcmk__apply_coloc_to_weights(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint) { const char *attribute = CRM_ATTR_ID; const char *value = NULL; GHashTable *work = NULL; GHashTableIter iter; pe_node_t *node = NULL; if (constraint->node_attribute != NULL) { attribute = constraint->node_attribute; } if (primary->allocated_to != NULL) { value = pe_node_attribute_raw(primary->allocated_to, attribute); } else if (constraint->score < 0) { // Nothing to do (anti-colocation with something that is not running) return; } work = pcmk__copy_node_table(dependent->allowed_nodes); g_hash_table_iter_init(&iter, work); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { if (primary->allocated_to == NULL) { pe_rsc_trace(dependent, "%s: %s@%s -= %d (%s inactive)", constraint->id, dependent->id, node->details->uname, constraint->score, primary->id); node->weight = pcmk__add_scores(-constraint->score, node->weight); } else if (pcmk__str_eq(pe_node_attribute_raw(node, attribute), value, pcmk__str_casei)) { if (constraint->score < CRM_SCORE_INFINITY) { pe_rsc_trace(dependent, "%s: %s@%s += %d", constraint->id, dependent->id, node->details->uname, constraint->score); node->weight = pcmk__add_scores(constraint->score, node->weight); } } else if (constraint->score >= CRM_SCORE_INFINITY) { pe_rsc_trace(dependent, "%s: %s@%s -= %d (%s mismatch)", constraint->id, dependent->id, node->details->uname, constraint->score, attribute); node->weight = pcmk__add_scores(-constraint->score, node->weight); } } if ((constraint->score <= -INFINITY) || (constraint->score >= INFINITY) || pcmk__any_node_available(work)) { g_hash_table_destroy(dependent->allowed_nodes); dependent->allowed_nodes = work; work = NULL; } else { pe_rsc_info(dependent, "%s: Rolling back scores from %s (no available nodes)", dependent->id, primary->id); } if (work != NULL) { g_hash_table_destroy(work); } } /*! * \internal * \brief Apply colocation to dependent for role purposes * * Update the priority of the dependent resource in a colocation, for the * purposes of selecting its role * * \param[in] dependent Dependent resource in colocation * \param[in] primary Primary resource in colocation * \param[in] constraint Colocation constraint */ void pcmk__apply_coloc_to_priority(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint) { const char *dependent_value = NULL; const char *primary_value = NULL; const char *attribute = CRM_ATTR_ID; int score_multiplier = 1; if ((primary->allocated_to == NULL) || (dependent->allocated_to == NULL)) { return; } if (constraint->node_attribute != NULL) { attribute = constraint->node_attribute; } dependent_value = pe_node_attribute_raw(dependent->allocated_to, attribute); primary_value = pe_node_attribute_raw(primary->allocated_to, attribute); if (!pcmk__str_eq(dependent_value, primary_value, pcmk__str_casei)) { if ((constraint->score == INFINITY) && (constraint->dependent_role == RSC_ROLE_PROMOTED)) { dependent->priority = -INFINITY; } return; } if ((constraint->primary_role != RSC_ROLE_UNKNOWN) && (constraint->primary_role != primary->next_role)) { return; } if (constraint->dependent_role == RSC_ROLE_UNPROMOTED) { score_multiplier = -1; } dependent->priority = pcmk__add_scores(score_multiplier * constraint->score, dependent->priority); } + +/*! + * \internal + * \brief Apply a colocation constraint to allowed nodes' weights + * + * \param[in] colocation Colocation constraint to apply + * \param[in] rsc1 Resource whose allowed nodes should be updated + * \param[in] rsc2 Resource whose preferences should be added + * \param[in] flags Flags (enum pe_weights) to apply when adding scores + */ +void +pcmk__apply_colocation(pcmk__colocation_t *colocation, pe_resource_t *rsc1, + pe_resource_t *rsc2, uint32_t flags) +{ + CRM_ASSERT((colocation != NULL) && (rsc1 != NULL) && (rsc2 != NULL)); + + rsc1->allowed_nodes = rsc2->cmds->merge_weights(rsc2, rsc1->id, + rsc1->allowed_nodes, + colocation->node_attribute, + colocation->score / (float) INFINITY, + flags); +} diff --git a/lib/pacemaker/pcmk_sched_native.c b/lib/pacemaker/pcmk_sched_native.c index 31efc032e7..4cc7daac7c 100644 --- a/lib/pacemaker/pcmk_sched_native.c +++ b/lib/pacemaker/pcmk_sched_native.c @@ -1,2640 +1,2638 @@ /* * Copyright 2004-2022 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. */ #include #include #include #include #include #include #include #include "libpacemaker_private.h" // The controller removes the resource from the CIB, making this redundant // #define DELETE_THEN_REFRESH 1 #define INFINITY_HACK (INFINITY * -100) #define VARIANT_NATIVE 1 #include extern bool pcmk__is_daemon; static void Recurring(pe_resource_t *rsc, pe_action_t *start, pe_node_t *node, pe_working_set_t *data_set); static void RecurringOp(pe_resource_t *rsc, pe_action_t *start, pe_node_t *node, xmlNode *operation, pe_working_set_t *data_set); static void Recurring_Stopped(pe_resource_t *rsc, pe_action_t *start, pe_node_t *node, pe_working_set_t *data_set); static void RecurringOp_Stopped(pe_resource_t *rsc, pe_action_t *start, pe_node_t *node, xmlNode *operation, pe_working_set_t *data_set); gboolean DeleteRsc(pe_resource_t * rsc, pe_node_t * node, gboolean optional, pe_working_set_t * data_set); gboolean StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); gboolean StartRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); gboolean DemoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); gboolean PromoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); gboolean RoleError(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); gboolean NullOp(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set); /* This array says what the *next* role should be when transitioning from one * role to another. For example going from Stopped to Promoted, the next role is * RSC_ROLE_UNPROMOTED, because the resource must be started before being promoted. * The current state then becomes Started, which is fed into this array again, * giving a next role of RSC_ROLE_PROMOTED. */ static enum rsc_role_e rsc_state_matrix[RSC_ROLE_MAX][RSC_ROLE_MAX] = { /* Current state Next state*/ /* Unknown Stopped Started Unpromoted Promoted */ /* Unknown */ { RSC_ROLE_UNKNOWN, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED }, /* Stopped */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STARTED, RSC_ROLE_UNPROMOTED, RSC_ROLE_UNPROMOTED }, /* Started */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STARTED, RSC_ROLE_UNPROMOTED, RSC_ROLE_PROMOTED }, /* Unpromoted */ { RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_STOPPED, RSC_ROLE_UNPROMOTED, RSC_ROLE_PROMOTED }, /* Promoted */ { RSC_ROLE_STOPPED, RSC_ROLE_UNPROMOTED, RSC_ROLE_UNPROMOTED, RSC_ROLE_UNPROMOTED, RSC_ROLE_PROMOTED }, }; typedef gboolean (*rsc_transition_fn)(pe_resource_t *rsc, pe_node_t *next, gboolean optional, pe_working_set_t *data_set); // This array picks the function needed to transition from one role to another static rsc_transition_fn rsc_action_matrix[RSC_ROLE_MAX][RSC_ROLE_MAX] = { /* Current state Next state */ /* Unknown Stopped Started Unpromoted Promoted */ /* Unknown */ { RoleError, StopRsc, RoleError, RoleError, RoleError, }, /* Stopped */ { RoleError, NullOp, StartRsc, StartRsc, RoleError, }, /* Started */ { RoleError, StopRsc, NullOp, NullOp, PromoteRsc, }, /* Unpromoted */ { RoleError, StopRsc, StopRsc, NullOp, PromoteRsc, }, /* Promoted */ { RoleError, DemoteRsc, DemoteRsc, DemoteRsc, NullOp, }, }; #define clear_node_weights_flags(nw_flags, nw_rsc, flags_to_clear) do { \ flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ "Node weight", (nw_rsc)->id, (flags), \ (flags_to_clear), #flags_to_clear); \ } while (0) static bool native_choose_node(pe_resource_t * rsc, pe_node_t * prefer, pe_working_set_t * data_set) { GList *nodes = NULL; pe_node_t *chosen = NULL; pe_node_t *best = NULL; int multiple = 1; int length = 0; bool result = false; pcmk__ban_insufficient_capacity(rsc, &prefer); if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return rsc->allocated_to != NULL; } // Sort allowed nodes by weight if (rsc->allowed_nodes) { length = g_hash_table_size(rsc->allowed_nodes); } if (length > 0) { nodes = g_hash_table_get_values(rsc->allowed_nodes); nodes = pcmk__sort_nodes(nodes, pe__current_node(rsc), data_set); // First node in sorted list has the best score best = g_list_nth_data(nodes, 0); } if (prefer && nodes) { chosen = g_hash_table_lookup(rsc->allowed_nodes, prefer->details->id); if (chosen == NULL) { pe_rsc_trace(rsc, "Preferred node %s for %s was unknown", prefer->details->uname, rsc->id); /* Favor the preferred node as long as its weight is at least as good as * the best allowed node's. * * An alternative would be to favor the preferred node even if the best * node is better, when the best node's weight is less than INFINITY. */ } else if (chosen->weight < best->weight) { pe_rsc_trace(rsc, "Preferred node %s for %s was unsuitable", chosen->details->uname, rsc->id); chosen = NULL; } else if (!pcmk__node_available(chosen, true, false)) { pe_rsc_trace(rsc, "Preferred node %s for %s was unavailable", chosen->details->uname, rsc->id); chosen = NULL; } else { pe_rsc_trace(rsc, "Chose preferred node %s for %s (ignoring %d candidates)", chosen->details->uname, rsc->id, length); } } if ((chosen == NULL) && nodes) { /* Either there is no preferred node, or the preferred node is not * available, but there are other nodes allowed to run the resource. */ chosen = best; pe_rsc_trace(rsc, "Chose node %s for %s from %d candidates", chosen ? chosen->details->uname : "", rsc->id, length); if (!pe_rsc_is_unique_clone(rsc->parent) && (chosen != NULL) && (chosen->weight > 0) // Zero not acceptable && pcmk__node_available(chosen, false, false)) { /* If the resource is already running on a node, prefer that node if * it is just as good as the chosen node. * * We don't do this for unique clone instances, because * distribute_children() has already assigned instances to their * running nodes when appropriate, and if we get here, we don't want * remaining unallocated instances to prefer a node that's already * running another instance. */ pe_node_t *running = pe__current_node(rsc); if ((running != NULL) && !pcmk__node_available(running, true, false)) { pe_rsc_trace(rsc, "Current node for %s (%s) can't run resources", rsc->id, running->details->uname); } else if (running) { for (GList *iter = nodes->next; iter; iter = iter->next) { pe_node_t *tmp = (pe_node_t *) iter->data; if (tmp->weight != chosen->weight) { // The nodes are sorted by weight, so no more are equal break; } if (tmp->details == running->details) { // Scores are equal, so prefer the current node chosen = tmp; } multiple++; } } } } if (multiple > 1) { do_crm_log(((chosen->weight >= INFINITY)? LOG_WARNING : LOG_INFO), "Chose node %s for %s from %d nodes with score %s", chosen->details->uname, rsc->id, multiple, pcmk_readable_score(chosen->weight)); } result = pcmk__assign_primitive(rsc, chosen, false); g_list_free(nodes); return result; } /*! * \internal * \brief Find score of highest-scored node that matches colocation attribute * * \param[in] rsc Resource whose allowed nodes should be searched * \param[in] attr Colocation attribute name (must not be NULL) * \param[in] value Colocation attribute value to require */ static int best_node_score_matching_attr(const pe_resource_t *rsc, const char *attr, const char *value) { GHashTableIter iter; pe_node_t *node = NULL; int best_score = -INFINITY; const char *best_node = NULL; // Find best allowed node with matching attribute g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **) &node)) { if ((node->weight > best_score) && pcmk__node_available(node, false, false) && pcmk__str_eq(value, pe_node_attribute_raw(node, attr), pcmk__str_casei)) { best_score = node->weight; best_node = node->details->uname; } } if (!pcmk__str_eq(attr, CRM_ATTR_UNAME, pcmk__str_casei)) { if (best_node == NULL) { crm_info("No allowed node for %s matches node attribute %s=%s", rsc->id, attr, value); } else { crm_info("Allowed node %s for %s had best score (%d) " "of those matching node attribute %s=%s", best_node, rsc->id, best_score, attr, value); } } return best_score; } /*! * \internal * \brief Add resource's colocation matches to current node allocation scores * * For each node in a given table, if any of a given resource's allowed nodes * have a matching value for the colocation attribute, add the highest of those * nodes' scores to the node's score. * * \param[in,out] nodes Hash table of nodes with allocation scores so far * \param[in] rsc Resource whose allowed nodes should be compared * \param[in] attr Colocation attribute that must match (NULL for default) * \param[in] factor Factor by which to multiply scores being added * \param[in] only_positive Whether to add only positive scores */ static void add_node_scores_matching_attr(GHashTable *nodes, const pe_resource_t *rsc, const char *attr, float factor, bool only_positive) { GHashTableIter iter; pe_node_t *node = NULL; if (attr == NULL) { attr = CRM_ATTR_UNAME; } // Iterate through each node g_hash_table_iter_init(&iter, nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { float weight_f = 0; int weight = 0; int score = 0; int new_score = 0; score = best_node_score_matching_attr(rsc, attr, pe_node_attribute_raw(node, attr)); if ((factor < 0) && (score < 0)) { /* Negative preference for a node with a negative score * should not become a positive preference. * * @TODO Consider filtering only if weight is -INFINITY */ crm_trace("%s: Filtering %d + %f * %d (double negative disallowed)", node->details->uname, node->weight, factor, score); continue; } if (node->weight == INFINITY_HACK) { crm_trace("%s: Filtering %d + %f * %d (node was marked unusable)", node->details->uname, node->weight, factor, score); continue; } weight_f = factor * score; // Round the number; see http://c-faq.com/fp/round.html weight = (int) ((weight_f < 0)? (weight_f - 0.5) : (weight_f + 0.5)); /* Small factors can obliterate the small scores that are often actually * used in configurations. If the score and factor are nonzero, ensure * that the result is nonzero as well. */ if ((weight == 0) && (score != 0)) { if (factor > 0.0) { weight = 1; } else if (factor < 0.0) { weight = -1; } } new_score = pcmk__add_scores(weight, node->weight); if (only_positive && (new_score < 0) && (node->weight > 0)) { crm_trace("%s: Filtering %d + %f * %d = %d " "(negative disallowed, marking node unusable)", node->details->uname, node->weight, factor, score, new_score); node->weight = INFINITY_HACK; continue; } if (only_positive && (new_score < 0) && (node->weight == 0)) { crm_trace("%s: Filtering %d + %f * %d = %d (negative disallowed)", node->details->uname, node->weight, factor, score, new_score); continue; } crm_trace("%s: %d + %f * %d = %d", node->details->uname, node->weight, factor, score, new_score); node->weight = new_score; } } static inline bool is_nonempty_group(pe_resource_t *rsc) { return rsc && (rsc->variant == pe_group) && (rsc->children != NULL); } /*! * \internal * \brief Incorporate colocation constraint scores into node weights * * \param[in,out] rsc Resource being placed * \param[in] primary_id ID of primary resource in constraint * \param[in,out] nodes Nodes, with scores as of this point * \param[in] attr Colocation attribute (ID by default) * \param[in] factor Incorporate scores multiplied by this factor * \param[in] flags Bitmask of enum pe_weights values * * \return Nodes, with scores modified by this constraint * \note This function assumes ownership of the nodes argument. The caller * should free the returned copy rather than the original. */ GHashTable * pcmk__native_merge_weights(pe_resource_t *rsc, const char *primary_id, GHashTable *nodes, const char *attr, float factor, uint32_t flags) { GHashTable *work = NULL; // Avoid infinite recursion if (pcmk_is_set(rsc->flags, pe_rsc_merging)) { pe_rsc_info(rsc, "%s: Breaking dependency loop at %s", primary_id, rsc->id); return nodes; } pe__set_resource_flags(rsc, pe_rsc_merging); if (pcmk_is_set(flags, pe_weights_init)) { if (is_nonempty_group(rsc)) { GList *last = g_list_last(rsc->children); pe_resource_t *last_rsc = last->data; pe_rsc_trace(rsc, "%s: Merging scores from group %s " "using last member %s (at %.6f)", primary_id, rsc->id, last_rsc->id, factor); work = pcmk__native_merge_weights(last_rsc, primary_id, NULL, attr, factor, flags); } else { work = pcmk__copy_node_table(rsc->allowed_nodes); } clear_node_weights_flags(flags, rsc, pe_weights_init); } else if (is_nonempty_group(rsc)) { /* The first member of the group will recursively incorporate any * constraints involving other members (including the group internal * colocation). * * @TODO The indirect colocations from the dependent group's other * members will be incorporated at full strength rather than by * factor, so the group's combined stickiness will be treated as * (factor + (#members - 1)) * stickiness. It is questionable what * the right approach should be. */ pe_rsc_trace(rsc, "%s: Merging scores from first member of group %s " "(at %.6f)", primary_id, rsc->id, factor); work = pcmk__copy_node_table(nodes); work = pcmk__native_merge_weights(rsc->children->data, primary_id, work, attr, factor, flags); } else { pe_rsc_trace(rsc, "%s: Merging scores from %s (at %.6f)", primary_id, rsc->id, factor); work = pcmk__copy_node_table(nodes); add_node_scores_matching_attr(work, rsc, attr, factor, pcmk_is_set(flags, pe_weights_positive)); } if (pcmk__any_node_available(work)) { GList *gIter = NULL; int multiplier = (factor < 0)? -1 : 1; if (pcmk_is_set(flags, pe_weights_forward)) { gIter = rsc->rsc_cons; pe_rsc_trace(rsc, "Checking additional %d optional '%s with' constraints", g_list_length(gIter), rsc->id); } else if (is_nonempty_group(rsc)) { pe_resource_t *last_rsc = g_list_last(rsc->children)->data; gIter = last_rsc->rsc_cons_lhs; pe_rsc_trace(rsc, "Checking additional %d optional 'with group %s' " "constraints using last member %s", g_list_length(gIter), rsc->id, last_rsc->id); } else { gIter = rsc->rsc_cons_lhs; pe_rsc_trace(rsc, "Checking additional %d optional 'with %s' constraints", g_list_length(gIter), rsc->id); } for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *other = NULL; pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (pcmk_is_set(flags, pe_weights_forward)) { other = constraint->primary; } else if (!pcmk__colocation_has_influence(constraint, NULL)) { continue; } else { other = constraint->dependent; } pe_rsc_trace(rsc, "Optionally merging score of '%s' constraint (%s with %s)", constraint->id, constraint->dependent->id, constraint->primary->id); work = pcmk__native_merge_weights(other, primary_id, work, constraint->node_attribute, multiplier * constraint->score / (float) INFINITY, flags|pe_weights_rollback); pe__show_node_weights(true, NULL, primary_id, work, rsc->cluster); } } else if (pcmk_is_set(flags, pe_weights_rollback)) { pe_rsc_info(rsc, "%s: Rolling back optional scores from %s", primary_id, rsc->id); g_hash_table_destroy(work); pe__clear_resource_flags(rsc, pe_rsc_merging); return nodes; } if (pcmk_is_set(flags, pe_weights_positive)) { pe_node_t *node = NULL; GHashTableIter iter; g_hash_table_iter_init(&iter, work); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { if (node->weight == INFINITY_HACK) { node->weight = 1; } } } if (nodes) { g_hash_table_destroy(nodes); } pe__clear_resource_flags(rsc, pe_rsc_merging); return work; } pe_node_t * pcmk__native_allocate(pe_resource_t *rsc, pe_node_t *prefer, pe_working_set_t *data_set) { GList *gIter = NULL; if (rsc->parent && !pcmk_is_set(rsc->parent->flags, pe_rsc_allocating)) { /* never allocate children on their own */ pe_rsc_debug(rsc, "Escalating allocation of %s to its parent: %s", rsc->id, rsc->parent->id); rsc->parent->cmds->allocate(rsc->parent, prefer, data_set); } if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return rsc->allocated_to; } if (pcmk_is_set(rsc->flags, pe_rsc_allocating)) { pe_rsc_debug(rsc, "Dependency loop detected involving %s", rsc->id); return NULL; } pe__set_resource_flags(rsc, pe_rsc_allocating); pe__show_node_weights(true, rsc, "Pre-alloc", rsc->allowed_nodes, data_set); for (gIter = rsc->rsc_cons; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; GHashTable *archive = NULL; pe_resource_t *primary = constraint->primary; if ((constraint->dependent_role >= RSC_ROLE_PROMOTED) || (constraint->score < 0 && constraint->score > -INFINITY)) { archive = pcmk__copy_node_table(rsc->allowed_nodes); } pe_rsc_trace(rsc, "%s: Allocating %s first (constraint=%s score=%d role=%s)", rsc->id, primary->id, constraint->id, constraint->score, role2text(constraint->dependent_role)); primary->cmds->allocate(primary, NULL, data_set); rsc->cmds->rsc_colocation_lh(rsc, primary, constraint, data_set); if (archive && !pcmk__any_node_available(rsc->allowed_nodes)) { pe_rsc_info(rsc, "%s: Rolling back scores from %s", rsc->id, primary->id); g_hash_table_destroy(rsc->allowed_nodes); rsc->allowed_nodes = archive; archive = NULL; } if (archive) { g_hash_table_destroy(archive); } } pe__show_node_weights(true, rsc, "Post-coloc", rsc->allowed_nodes, data_set); for (gIter = rsc->rsc_cons_lhs; gIter != NULL; gIter = gIter->next) { pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; if (!pcmk__colocation_has_influence(constraint, NULL)) { continue; } pe_rsc_trace(rsc, "Merging score of '%s' constraint (%s with %s)", constraint->id, constraint->dependent->id, constraint->primary->id); - rsc->allowed_nodes = constraint->dependent->cmds->merge_weights( - constraint->dependent, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, constraint->score / (float) INFINITY, - pe_weights_rollback); + pcmk__apply_colocation(constraint, rsc, constraint->dependent, + pe_weights_rollback); } if (rsc->next_role == RSC_ROLE_STOPPED) { pe_rsc_trace(rsc, "Making sure %s doesn't get allocated", rsc->id); /* make sure it doesn't come up again */ resource_location(rsc, NULL, -INFINITY, XML_RSC_ATTR_TARGET_ROLE, data_set); } else if(rsc->next_role > rsc->role && !pcmk_is_set(data_set->flags, pe_flag_have_quorum) && data_set->no_quorum_policy == no_quorum_freeze) { crm_notice("Resource %s cannot be elevated from %s to %s: no-quorum-policy=freeze", rsc->id, role2text(rsc->role), role2text(rsc->next_role)); pe__set_next_role(rsc, rsc->role, "no-quorum-policy=freeze"); } pe__show_node_weights(!pcmk_is_set(data_set->flags, pe_flag_show_scores), rsc, __func__, rsc->allowed_nodes, data_set); if (pcmk_is_set(data_set->flags, pe_flag_stonith_enabled) && !pcmk_is_set(data_set->flags, pe_flag_have_stonith_resource)) { pe__clear_resource_flags(rsc, pe_rsc_managed); } if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) { const char *reason = NULL; pe_node_t *assign_to = NULL; pe__set_next_role(rsc, rsc->role, "unmanaged"); assign_to = pe__current_node(rsc); if (assign_to == NULL) { reason = "inactive"; } else if (rsc->role == RSC_ROLE_PROMOTED) { reason = "promoted"; } else if (pcmk_is_set(rsc->flags, pe_rsc_failed)) { reason = "failed"; } else { reason = "active"; } pe_rsc_info(rsc, "Unmanaged resource %s allocated to %s: %s", rsc->id, (assign_to? assign_to->details->uname : "no node"), reason); pcmk__assign_primitive(rsc, assign_to, true); } else if (pcmk_is_set(data_set->flags, pe_flag_stop_everything)) { pe_rsc_debug(rsc, "Forcing %s to stop", rsc->id); pcmk__assign_primitive(rsc, NULL, true); } else if (pcmk_is_set(rsc->flags, pe_rsc_provisional) && native_choose_node(rsc, prefer, data_set)) { pe_rsc_trace(rsc, "Allocated resource %s to %s", rsc->id, rsc->allocated_to->details->uname); } else if (rsc->allocated_to == NULL) { if (!pcmk_is_set(rsc->flags, pe_rsc_orphan)) { pe_rsc_info(rsc, "Resource %s cannot run anywhere", rsc->id); } else if (rsc->running_on != NULL) { pe_rsc_info(rsc, "Stopping orphan resource %s", rsc->id); } } else { pe_rsc_debug(rsc, "Pre-Allocated resource %s to %s", rsc->id, rsc->allocated_to->details->uname); } pe__clear_resource_flags(rsc, pe_rsc_allocating); if (rsc->is_remote_node) { pe_node_t *remote_node = pe_find_node(data_set->nodes, rsc->id); CRM_ASSERT(remote_node != NULL); if (rsc->allocated_to && rsc->next_role != RSC_ROLE_STOPPED) { crm_trace("Setting Pacemaker Remote node %s to ONLINE", remote_node->details->id); remote_node->details->online = TRUE; /* We shouldn't consider an unseen remote-node unclean if we are going * to try and connect to it. Otherwise we get an unnecessary fence */ if (remote_node->details->unseen == TRUE) { remote_node->details->unclean = FALSE; } } else { crm_trace("Setting Pacemaker Remote node %s to SHUTDOWN (next role %s, %sallocated)", remote_node->details->id, role2text(rsc->next_role), (rsc->allocated_to? "" : "un")); remote_node->details->shutdown = TRUE; } } return rsc->allocated_to; } static gboolean is_op_dup(pe_resource_t *rsc, const char *name, guint interval_ms) { gboolean dup = FALSE; const char *id = NULL; const char *value = NULL; xmlNode *operation = NULL; guint interval2_ms = 0; CRM_ASSERT(rsc); for (operation = pcmk__xe_first_child(rsc->ops_xml); operation != NULL; operation = pcmk__xe_next(operation)) { if (pcmk__str_eq((const char *)operation->name, "op", pcmk__str_none)) { value = crm_element_value(operation, "name"); if (!pcmk__str_eq(value, name, pcmk__str_casei)) { continue; } value = crm_element_value(operation, XML_LRM_ATTR_INTERVAL); interval2_ms = crm_parse_interval_spec(value); if (interval_ms != interval2_ms) { continue; } if (id == NULL) { id = ID(operation); } else { pcmk__config_err("Operation %s is duplicate of %s (do not use " "same name and interval combination more " "than once per resource)", ID(operation), id); dup = TRUE; } } } return dup; } static bool op_cannot_recur(const char *name) { return pcmk__strcase_any_of(name, RSC_STOP, RSC_START, RSC_DEMOTE, RSC_PROMOTE, NULL); } static void RecurringOp(pe_resource_t * rsc, pe_action_t * start, pe_node_t * node, xmlNode * operation, pe_working_set_t * data_set) { char *key = NULL; const char *name = NULL; const char *role = NULL; const char *interval_spec = NULL; const char *node_uname = node? node->details->uname : "n/a"; guint interval_ms = 0; pe_action_t *mon = NULL; gboolean is_optional = TRUE; GList *possible_matches = NULL; CRM_ASSERT(rsc); /* Only process for the operations without role="Stopped" */ role = crm_element_value(operation, "role"); if (role && text2role(role) == RSC_ROLE_STOPPED) { return; } interval_spec = crm_element_value(operation, XML_LRM_ATTR_INTERVAL); interval_ms = crm_parse_interval_spec(interval_spec); if (interval_ms == 0) { return; } name = crm_element_value(operation, "name"); if (is_op_dup(rsc, name, interval_ms)) { crm_trace("Not creating duplicate recurring action %s for %dms %s", ID(operation), interval_ms, name); return; } if (op_cannot_recur(name)) { pcmk__config_err("Ignoring %s because action '%s' cannot be recurring", ID(operation), name); return; } key = pcmk__op_key(rsc->id, name, interval_ms); if (find_rsc_op_entry(rsc, key) == NULL) { crm_trace("Not creating recurring action %s for disabled resource %s", ID(operation), rsc->id); free(key); return; } pe_rsc_trace(rsc, "Creating recurring action %s for %s in role %s on %s", ID(operation), rsc->id, role2text(rsc->next_role), node_uname); if (start != NULL) { pe_rsc_trace(rsc, "Marking %s %s due to %s", key, pcmk_is_set(start->flags, pe_action_optional)? "optional" : "mandatory", start->uuid); is_optional = (rsc->cmds->action_flags(start, NULL) & pe_action_optional); } else { pe_rsc_trace(rsc, "Marking %s optional", key); is_optional = TRUE; } /* start a monitor for an already active resource */ possible_matches = find_actions_exact(rsc->actions, key, node); if (possible_matches == NULL) { is_optional = FALSE; pe_rsc_trace(rsc, "Marking %s mandatory: not active", key); } else { GList *gIter = NULL; for (gIter = possible_matches; gIter != NULL; gIter = gIter->next) { pe_action_t *op = (pe_action_t *) gIter->data; if (pcmk_is_set(op->flags, pe_action_reschedule)) { is_optional = FALSE; break; } } g_list_free(possible_matches); } if (((rsc->next_role == RSC_ROLE_PROMOTED) && (role == NULL)) || (role != NULL && text2role(role) != rsc->next_role)) { int log_level = LOG_TRACE; const char *result = "Ignoring"; if (is_optional) { char *after_key = NULL; pe_action_t *cancel_op = NULL; // It's running, so cancel it log_level = LOG_INFO; result = "Cancelling"; cancel_op = pcmk__new_cancel_action(rsc, name, interval_ms, node); switch (rsc->role) { case RSC_ROLE_UNPROMOTED: case RSC_ROLE_STARTED: if (rsc->next_role == RSC_ROLE_PROMOTED) { after_key = promote_key(rsc); } else if (rsc->next_role == RSC_ROLE_STOPPED) { after_key = stop_key(rsc); } break; case RSC_ROLE_PROMOTED: after_key = demote_key(rsc); break; default: break; } if (after_key) { pcmk__new_ordering(rsc, NULL, cancel_op, rsc, after_key, NULL, pe_order_runnable_left, data_set); } } do_crm_log(log_level, "%s action %s (%s vs. %s)", result, key, role ? role : role2text(RSC_ROLE_UNPROMOTED), role2text(rsc->next_role)); free(key); return; } mon = custom_action(rsc, key, name, node, is_optional, TRUE, data_set); key = mon->uuid; if (is_optional) { pe_rsc_trace(rsc, "%s\t %s (optional)", node_uname, mon->uuid); } if ((start == NULL) || !pcmk_is_set(start->flags, pe_action_runnable)) { pe_rsc_debug(rsc, "%s\t %s (cancelled : start un-runnable)", node_uname, mon->uuid); pe__clear_action_flags(mon, pe_action_runnable); } else if (node == NULL || node->details->online == FALSE || node->details->unclean) { pe_rsc_debug(rsc, "%s\t %s (cancelled : no node available)", node_uname, mon->uuid); pe__clear_action_flags(mon, pe_action_runnable); } else if (!pcmk_is_set(mon->flags, pe_action_optional)) { pe_rsc_info(rsc, " Start recurring %s (%us) for %s on %s", mon->task, interval_ms / 1000, rsc->id, node_uname); } if (rsc->next_role == RSC_ROLE_PROMOTED) { char *running_promoted = pcmk__itoa(PCMK_OCF_RUNNING_PROMOTED); add_hash_param(mon->meta, XML_ATTR_TE_TARGET_RC, running_promoted); free(running_promoted); } if ((node == NULL) || pcmk_is_set(rsc->flags, pe_rsc_managed)) { pcmk__new_ordering(rsc, start_key(rsc), NULL, NULL, strdup(key), mon, pe_order_implies_then|pe_order_runnable_left, data_set); pcmk__new_ordering(rsc, reload_key(rsc), NULL, NULL, strdup(key), mon, pe_order_implies_then|pe_order_runnable_left, data_set); if (rsc->next_role == RSC_ROLE_PROMOTED) { pcmk__new_ordering(rsc, promote_key(rsc), NULL, rsc, NULL, mon, pe_order_optional|pe_order_runnable_left, data_set); } else if (rsc->role == RSC_ROLE_PROMOTED) { pcmk__new_ordering(rsc, demote_key(rsc), NULL, rsc, NULL, mon, pe_order_optional|pe_order_runnable_left, data_set); } } } static void Recurring(pe_resource_t * rsc, pe_action_t * start, pe_node_t * node, pe_working_set_t * data_set) { if (!pcmk_is_set(rsc->flags, pe_rsc_maintenance) && (node == NULL || node->details->maintenance == FALSE)) { xmlNode *operation = NULL; for (operation = pcmk__xe_first_child(rsc->ops_xml); operation != NULL; operation = pcmk__xe_next(operation)) { if (pcmk__str_eq((const char *)operation->name, "op", pcmk__str_none)) { RecurringOp(rsc, start, node, operation, data_set); } } } } static void RecurringOp_Stopped(pe_resource_t * rsc, pe_action_t * start, pe_node_t * node, xmlNode * operation, pe_working_set_t * data_set) { char *key = NULL; const char *name = NULL; const char *role = NULL; const char *interval_spec = NULL; const char *node_uname = node? node->details->uname : "n/a"; guint interval_ms = 0; GList *possible_matches = NULL; GList *gIter = NULL; /* Only process for the operations with role="Stopped" */ role = crm_element_value(operation, "role"); if (role == NULL || text2role(role) != RSC_ROLE_STOPPED) { return; } interval_spec = crm_element_value(operation, XML_LRM_ATTR_INTERVAL); interval_ms = crm_parse_interval_spec(interval_spec); if (interval_ms == 0) { return; } name = crm_element_value(operation, "name"); if (is_op_dup(rsc, name, interval_ms)) { crm_trace("Not creating duplicate recurring action %s for %dms %s", ID(operation), interval_ms, name); return; } if (op_cannot_recur(name)) { pcmk__config_err("Ignoring %s because action '%s' cannot be recurring", ID(operation), name); return; } key = pcmk__op_key(rsc->id, name, interval_ms); if (find_rsc_op_entry(rsc, key) == NULL) { crm_trace("Not creating recurring action %s for disabled resource %s", ID(operation), rsc->id); free(key); return; } // @TODO add support if (!pcmk_is_set(rsc->flags, pe_rsc_unique)) { crm_notice("Ignoring %s (recurring monitors for Stopped role are " "not supported for anonymous clones)", ID(operation)); return; } pe_rsc_trace(rsc, "Creating recurring action %s for %s in role %s on nodes where it should not be running", ID(operation), rsc->id, role2text(rsc->next_role)); /* if the monitor exists on the node where the resource will be running, cancel it */ if (node != NULL) { possible_matches = find_actions_exact(rsc->actions, key, node); if (possible_matches) { pe_action_t *cancel_op = NULL; g_list_free(possible_matches); cancel_op = pcmk__new_cancel_action(rsc, name, interval_ms, node); if ((rsc->next_role == RSC_ROLE_STARTED) || (rsc->next_role == RSC_ROLE_UNPROMOTED)) { /* rsc->role == RSC_ROLE_STOPPED: cancel the monitor before start */ /* rsc->role == RSC_ROLE_STARTED: for a migration, cancel the monitor on the target node before start */ pcmk__new_ordering(rsc, NULL, cancel_op, rsc, start_key(rsc), NULL, pe_order_runnable_left, data_set); } pe_rsc_info(rsc, "Cancel action %s (%s vs. %s) on %s", key, role, role2text(rsc->next_role), node_uname); } } for (gIter = data_set->nodes; gIter != NULL; gIter = gIter->next) { pe_node_t *stop_node = (pe_node_t *) gIter->data; const char *stop_node_uname = stop_node->details->uname; gboolean is_optional = TRUE; gboolean probe_is_optional = TRUE; gboolean stop_is_optional = TRUE; pe_action_t *stopped_mon = NULL; char *rc_inactive = NULL; GList *stop_ops = NULL; GList *local_gIter = NULL; if (node && pcmk__str_eq(stop_node_uname, node_uname, pcmk__str_casei)) { continue; } pe_rsc_trace(rsc, "Creating recurring action %s for %s on %s", ID(operation), rsc->id, pcmk__s(stop_node_uname, "unknown node")); /* start a monitor for an already stopped resource */ possible_matches = find_actions_exact(rsc->actions, key, stop_node); if (possible_matches == NULL) { pe_rsc_trace(rsc, "Marking %s mandatory on %s: not active", key, pcmk__s(stop_node_uname, "unknown node")); is_optional = FALSE; } else { pe_rsc_trace(rsc, "Marking %s optional on %s: already active", key, pcmk__s(stop_node_uname, "unknown node")); is_optional = TRUE; g_list_free(possible_matches); } stopped_mon = custom_action(rsc, strdup(key), name, stop_node, is_optional, TRUE, data_set); rc_inactive = pcmk__itoa(PCMK_OCF_NOT_RUNNING); add_hash_param(stopped_mon->meta, XML_ATTR_TE_TARGET_RC, rc_inactive); free(rc_inactive); if (pcmk_is_set(rsc->flags, pe_rsc_managed)) { GList *probes = pe__resource_actions(rsc, stop_node, RSC_STATUS, FALSE); GList *pIter = NULL; for (pIter = probes; pIter != NULL; pIter = pIter->next) { pe_action_t *probe = (pe_action_t *) pIter->data; order_actions(probe, stopped_mon, pe_order_runnable_left); crm_trace("%s then %s on %s", probe->uuid, stopped_mon->uuid, stop_node->details->uname); } g_list_free(probes); } stop_ops = pe__resource_actions(rsc, stop_node, RSC_STOP, TRUE); for (local_gIter = stop_ops; local_gIter != NULL; local_gIter = local_gIter->next) { pe_action_t *stop = (pe_action_t *) local_gIter->data; if (!pcmk_is_set(stop->flags, pe_action_optional)) { stop_is_optional = FALSE; } if (!pcmk_is_set(stop->flags, pe_action_runnable)) { crm_debug("%s\t %s (cancelled : stop un-runnable)", pcmk__s(stop_node_uname, ""), stopped_mon->uuid); pe__clear_action_flags(stopped_mon, pe_action_runnable); } if (pcmk_is_set(rsc->flags, pe_rsc_managed)) { pcmk__new_ordering(rsc, stop_key(rsc), stop, NULL, strdup(key), stopped_mon, pe_order_implies_then|pe_order_runnable_left, data_set); } } if (stop_ops) { g_list_free(stop_ops); } if (is_optional == FALSE && probe_is_optional && stop_is_optional && !pcmk_is_set(rsc->flags, pe_rsc_managed)) { pe_rsc_trace(rsc, "Marking %s optional on %s due to unmanaged", key, pcmk__s(stop_node_uname, "unknown node")); pe__set_action_flags(stopped_mon, pe_action_optional); } if (pcmk_is_set(stopped_mon->flags, pe_action_optional)) { pe_rsc_trace(rsc, "%s\t %s (optional)", pcmk__s(stop_node_uname, ""), stopped_mon->uuid); } if (stop_node->details->online == FALSE || stop_node->details->unclean) { pe_rsc_debug(rsc, "%s\t %s (cancelled : no node available)", pcmk__s(stop_node_uname, ""), stopped_mon->uuid); pe__clear_action_flags(stopped_mon, pe_action_runnable); } if (pcmk_is_set(stopped_mon->flags, pe_action_runnable) && !pcmk_is_set(stopped_mon->flags, pe_action_optional)) { crm_notice(" Start recurring %s (%us) for %s on %s", stopped_mon->task, interval_ms / 1000, rsc->id, pcmk__s(stop_node_uname, "unknown node")); } } free(key); } static void Recurring_Stopped(pe_resource_t * rsc, pe_action_t * start, pe_node_t * node, pe_working_set_t * data_set) { if (!pcmk_is_set(rsc->flags, pe_rsc_maintenance) && (node == NULL || node->details->maintenance == FALSE)) { xmlNode *operation = NULL; for (operation = pcmk__xe_first_child(rsc->ops_xml); operation != NULL; operation = pcmk__xe_next(operation)) { if (pcmk__str_eq((const char *)operation->name, "op", pcmk__str_none)) { RecurringOp_Stopped(rsc, start, node, operation, data_set); } } } } static void handle_migration_actions(pe_resource_t * rsc, pe_node_t *current, pe_node_t *chosen, pe_working_set_t * data_set) { pe_action_t *migrate_to = NULL; pe_action_t *migrate_from = NULL; pe_action_t *start = NULL; pe_action_t *stop = NULL; gboolean partial = rsc->partial_migration_target ? TRUE : FALSE; pe_rsc_trace(rsc, "Processing migration actions %s moving from %s to %s . partial migration = %s", rsc->id, current->details->id, chosen->details->id, partial ? "TRUE" : "FALSE"); start = start_action(rsc, chosen, TRUE); stop = stop_action(rsc, current, TRUE); if (partial == FALSE) { migrate_to = custom_action(rsc, pcmk__op_key(rsc->id, RSC_MIGRATE, 0), RSC_MIGRATE, current, TRUE, TRUE, data_set); } migrate_from = custom_action(rsc, pcmk__op_key(rsc->id, RSC_MIGRATED, 0), RSC_MIGRATED, chosen, TRUE, TRUE, data_set); if ((migrate_to && migrate_from) || (migrate_from && partial)) { pe__set_action_flags(start, pe_action_migrate_runnable); pe__set_action_flags(stop, pe_action_migrate_runnable); // This is easier than trying to delete it from the graph pe__set_action_flags(start, pe_action_pseudo); /* order probes before migrations */ if (partial) { pe__set_action_flags(migrate_from, pe_action_migrate_runnable); migrate_from->needs = start->needs; pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_STATUS, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_MIGRATED, 0), NULL, pe_order_optional, data_set); } else { pe__set_action_flags(migrate_from, pe_action_migrate_runnable); pe__set_action_flags(migrate_to, pe_action_migrate_runnable); migrate_to->needs = start->needs; pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_STATUS, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_MIGRATE, 0), NULL, pe_order_optional, data_set); pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_MIGRATE, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_MIGRATED, 0), NULL, pe_order_optional|pe_order_implies_first_migratable, data_set); } pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_MIGRATED, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_STOP, 0), NULL, pe_order_optional|pe_order_implies_first_migratable, data_set); pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_MIGRATED, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_START, 0), NULL, pe_order_optional|pe_order_implies_first_migratable|pe_order_pseudo_left, data_set); } if (migrate_to) { add_hash_param(migrate_to->meta, XML_LRM_ATTR_MIGRATE_SOURCE, current->details->uname); add_hash_param(migrate_to->meta, XML_LRM_ATTR_MIGRATE_TARGET, chosen->details->uname); /* Pacemaker Remote connections don't require pending to be recorded in * the CIB. We can reduce CIB writes by not setting PENDING for them. */ if (rsc->is_remote_node == FALSE) { /* migrate_to takes place on the source node, but can * have an effect on the target node depending on how * the agent is written. Because of this, we have to maintain * a record that the migrate_to occurred, in case the source node * loses membership while the migrate_to action is still in-flight. */ add_hash_param(migrate_to->meta, XML_OP_ATTR_PENDING, "true"); } } if (migrate_from) { add_hash_param(migrate_from->meta, XML_LRM_ATTR_MIGRATE_SOURCE, current->details->uname); add_hash_param(migrate_from->meta, XML_LRM_ATTR_MIGRATE_TARGET, chosen->details->uname); } } /*! * \internal * \brief Schedule actions to bring resource down and back to current role * * \param[in] rsc Resource to restart * \param[in] current Node that resource should be brought down on * \param[in] chosen Node that resource should be brought up on * \param[in] need_stop Whether the resource must be stopped * \param[in] need_promote Whether the resource must be promoted * * \return Role that resource would have after scheduled actions are taken */ static void schedule_restart_actions(pe_resource_t *rsc, pe_node_t *current, pe_node_t *chosen, bool need_stop, bool need_promote) { enum rsc_role_e role = rsc->role; enum rsc_role_e next_role; pe__set_resource_flags(rsc, pe_rsc_restarting); // Bring resource down to a stop on its current node while (role != RSC_ROLE_STOPPED) { next_role = rsc_state_matrix[role][RSC_ROLE_STOPPED]; pe_rsc_trace(rsc, "Creating %s action to take %s down from %s to %s", (need_stop? "required" : "optional"), rsc->id, role2text(role), role2text(next_role)); if (!rsc_action_matrix[role][next_role](rsc, current, !need_stop, rsc->cluster)) { break; } role = next_role; } // Bring resource up to its next role on its next node while ((rsc->role <= rsc->next_role) && (role != rsc->role) && !pcmk_is_set(rsc->flags, pe_rsc_block)) { bool required = need_stop; next_role = rsc_state_matrix[role][rsc->role]; if ((next_role == RSC_ROLE_PROMOTED) && need_promote) { required = true; } pe_rsc_trace(rsc, "Creating %s action to take %s up from %s to %s", (required? "required" : "optional"), rsc->id, role2text(role), role2text(next_role)); if (!rsc_action_matrix[role][next_role](rsc, chosen, !required, rsc->cluster)) { break; } role = next_role; } pe__clear_resource_flags(rsc, pe_rsc_restarting); } void native_create_actions(pe_resource_t * rsc, pe_working_set_t * data_set) { pe_action_t *start = NULL; pe_node_t *chosen = NULL; pe_node_t *current = NULL; gboolean need_stop = FALSE; bool need_promote = FALSE; gboolean is_moving = FALSE; gboolean allow_migrate = FALSE; GList *gIter = NULL; unsigned int num_all_active = 0; unsigned int num_clean_active = 0; bool multiply_active = FALSE; enum rsc_role_e role = RSC_ROLE_UNKNOWN; enum rsc_role_e next_role = RSC_ROLE_UNKNOWN; CRM_ASSERT(rsc != NULL); allow_migrate = pcmk_is_set(rsc->flags, pe_rsc_allow_migrate)? TRUE : FALSE; chosen = rsc->allocated_to; next_role = rsc->next_role; if (next_role == RSC_ROLE_UNKNOWN) { pe__set_next_role(rsc, (chosen == NULL)? RSC_ROLE_STOPPED : RSC_ROLE_STARTED, "allocation"); } pe_rsc_trace(rsc, "Creating all actions for %s transition from %s to %s (%s) on %s", rsc->id, role2text(rsc->role), role2text(rsc->next_role), ((next_role == RSC_ROLE_UNKNOWN)? "implicit" : "explicit"), ((chosen == NULL)? "no node" : chosen->details->uname)); current = pe__find_active_on(rsc, &num_all_active, &num_clean_active); for (gIter = rsc->dangling_migrations; gIter != NULL; gIter = gIter->next) { pe_node_t *dangling_source = (pe_node_t *) gIter->data; pe_action_t *stop = NULL; pe_rsc_trace(rsc, "Creating stop action %sfor %s on %s due to dangling migration", pcmk_is_set(data_set->flags, pe_flag_remove_after_stop)? "and cleanup " : "", rsc->id, dangling_source->details->uname); stop = stop_action(rsc, dangling_source, FALSE); pe__set_action_flags(stop, pe_action_dangle); if (pcmk_is_set(data_set->flags, pe_flag_remove_after_stop)) { DeleteRsc(rsc, dangling_source, FALSE, data_set); } } if ((num_all_active == 2) && (num_clean_active == 2) && chosen && rsc->partial_migration_source && rsc->partial_migration_target && (current->details == rsc->partial_migration_source->details) && (chosen->details == rsc->partial_migration_target->details)) { /* The chosen node is still the migration target from a partial * migration. Attempt to continue the migration instead of recovering * by stopping the resource everywhere and starting it on a single node. */ pe_rsc_trace(rsc, "Will attempt to continue with partial migration " "to target %s from %s", rsc->partial_migration_target->details->id, rsc->partial_migration_source->details->id); } else if (!pcmk_is_set(rsc->flags, pe_rsc_needs_fencing)) { /* If a resource has "requires" set to nothing or quorum, don't consider * it active on unclean nodes (similar to how all resources behave when * stonith-enabled is false). We can start such resources elsewhere * before fencing completes, and if we considered the resource active on * the failed node, we would attempt recovery for being active on * multiple nodes. */ multiply_active = (num_clean_active > 1); } else { multiply_active = (num_all_active > 1); } if (multiply_active) { if (rsc->partial_migration_target && rsc->partial_migration_source) { // Migration was in progress, but we've chosen a different target crm_notice("Resource %s can no longer migrate from %s to %s " "(will stop on both nodes)", rsc->id, rsc->partial_migration_source->details->uname, rsc->partial_migration_target->details->uname); multiply_active = false; } else { const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); // Resource was (possibly) incorrectly multiply active pe_proc_err("%s resource %s might be active on %u nodes (%s)", pcmk__s(class, "Untyped"), rsc->id, num_all_active, recovery2text(rsc->recovery_type)); crm_notice("See https://wiki.clusterlabs.org/wiki/FAQ#Resource_is_Too_Active for more information"); } switch (rsc->recovery_type) { case recovery_stop_start: need_stop = TRUE; break; case recovery_stop_unexpected: need_stop = TRUE; // StopRsc() will skip expected node pe__set_resource_flags(rsc, pe_rsc_stop_unexpected); break; default: break; } /* If by chance a partial migration is in process, but the migration * target is not chosen still, clear all partial migration data. */ rsc->partial_migration_source = rsc->partial_migration_target = NULL; allow_migrate = FALSE; } if (!multiply_active) { pe__clear_resource_flags(rsc, pe_rsc_stop_unexpected); } if (pcmk_is_set(rsc->flags, pe_rsc_start_pending)) { pe_rsc_trace(rsc, "Creating start action for %s to represent already pending start", rsc->id); start = start_action(rsc, chosen, TRUE); pe__set_action_flags(start, pe_action_print_always); } if (current && chosen && current->details != chosen->details) { pe_rsc_trace(rsc, "Moving %s from %s to %s", rsc->id, pcmk__s(current->details->uname, "unknown node"), pcmk__s(chosen->details->uname, "unknown node")); is_moving = TRUE; need_stop = TRUE; } else if (pcmk_is_set(rsc->flags, pe_rsc_failed)) { if (pcmk_is_set(rsc->flags, pe_rsc_stop)) { need_stop = TRUE; pe_rsc_trace(rsc, "Recovering %s", rsc->id); } else { pe_rsc_trace(rsc, "Recovering %s by demotion", rsc->id); if (rsc->next_role == RSC_ROLE_PROMOTED) { need_promote = TRUE; } } } else if (pcmk_is_set(rsc->flags, pe_rsc_block)) { pe_rsc_trace(rsc, "Blocking further actions on %s", rsc->id); need_stop = TRUE; } else if (rsc->role > RSC_ROLE_STARTED && current != NULL && chosen != NULL) { pe_rsc_trace(rsc, "Creating start action for promoted resource %s", rsc->id); start = start_action(rsc, chosen, TRUE); if (!pcmk_is_set(start->flags, pe_action_optional)) { // Recovery of a promoted resource pe_rsc_trace(rsc, "%s restart is required for recovery", rsc->id); need_stop = TRUE; } } /* Create any additional actions required when bringing resource down and * back up to same level. */ schedule_restart_actions(rsc, current, chosen, need_stop, need_promote); /* Required steps from this role to the next */ role = rsc->role; while (role != rsc->next_role) { next_role = rsc_state_matrix[role][rsc->next_role]; pe_rsc_trace(rsc, "Creating action to take %s from %s to %s (ending at %s)", rsc->id, role2text(role), role2text(next_role), role2text(rsc->next_role)); if (rsc_action_matrix[role][next_role] (rsc, chosen, FALSE, data_set) == FALSE) { break; } role = next_role; } if (pcmk_is_set(rsc->flags, pe_rsc_block)) { pe_rsc_trace(rsc, "Not creating recurring monitors for blocked resource %s", rsc->id); } else if ((rsc->next_role != RSC_ROLE_STOPPED) || !pcmk_is_set(rsc->flags, pe_rsc_managed)) { pe_rsc_trace(rsc, "Creating recurring monitors for %s resource %s", ((rsc->next_role == RSC_ROLE_STOPPED)? "unmanaged" : "active"), rsc->id); start = start_action(rsc, chosen, TRUE); Recurring(rsc, start, chosen, data_set); Recurring_Stopped(rsc, start, chosen, data_set); } else { pe_rsc_trace(rsc, "Creating recurring monitors for inactive resource %s", rsc->id); Recurring_Stopped(rsc, NULL, NULL, data_set); } /* if we are stuck in a partial migration, where the target * of the partial migration no longer matches the chosen target. * A full stop/start is required */ if (rsc->partial_migration_target && (chosen == NULL || rsc->partial_migration_target->details != chosen->details)) { pe_rsc_trace(rsc, "Not allowing partial migration of %s to continue", rsc->id); allow_migrate = FALSE; } else if (!is_moving || !pcmk_is_set(rsc->flags, pe_rsc_managed) || pcmk_any_flags_set(rsc->flags, pe_rsc_failed|pe_rsc_start_pending) || (current && current->details->unclean) || rsc->next_role < RSC_ROLE_STARTED) { allow_migrate = FALSE; } if (allow_migrate) { handle_migration_actions(rsc, current, chosen, data_set); } } static void rsc_avoids_remote_nodes(pe_resource_t *rsc) { GHashTableIter iter; pe_node_t *node = NULL; g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { if (node->details->remote_rsc) { node->weight = -INFINITY; } } } /*! * \internal * \brief Return allowed nodes as (possibly sorted) list * * Convert a resource's hash table of allowed nodes to a list. If printing to * stdout, sort the list, to keep action ID numbers consistent for regression * test output (while avoiding the performance hit on a live cluster). * * \param[in] rsc Resource to check for allowed nodes * \param[in] data_set Cluster working set * * \return List of resource's allowed nodes * \note Callers should take care not to rely on the list being sorted. */ static GList * allowed_nodes_as_list(pe_resource_t *rsc, pe_working_set_t *data_set) { GList *allowed_nodes = NULL; if (rsc->allowed_nodes) { allowed_nodes = g_hash_table_get_values(rsc->allowed_nodes); } if (!pcmk__is_daemon) { allowed_nodes = g_list_sort(allowed_nodes, sort_node_uname); } return allowed_nodes; } void native_internal_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) { /* This function is on the critical path and worth optimizing as much as possible */ pe_resource_t *top = NULL; GList *allowed_nodes = NULL; bool check_unfencing = FALSE; bool check_utilization = false; if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) { pe_rsc_trace(rsc, "Skipping native constraints for unmanaged resource: %s", rsc->id); return; } top = uber_parent(rsc); // Whether resource requires unfencing check_unfencing = !pcmk_is_set(rsc->flags, pe_rsc_fence_device) && pcmk_is_set(data_set->flags, pe_flag_enable_unfencing) && pcmk_is_set(rsc->flags, pe_rsc_needs_unfencing); // Whether a non-default placement strategy is used check_utilization = (g_hash_table_size(rsc->utilization) > 0) && !pcmk__str_eq(data_set->placement_strategy, "default", pcmk__str_casei); // Order stops before starts (i.e. restart) pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_STOP, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_START, 0), NULL, pe_order_optional|pe_order_implies_then|pe_order_restart, data_set); // Promotable ordering: demote before stop, start before promote if (pcmk_is_set(top->flags, pe_rsc_promotable) || (rsc->role > RSC_ROLE_UNPROMOTED)) { pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_DEMOTE, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_STOP, 0), NULL, pe_order_promoted_implies_first, data_set); pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_START, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_PROMOTE, 0), NULL, pe_order_runnable_left, data_set); } // Don't clear resource history if probing on same node pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, CRM_OP_LRM_DELETE, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_STATUS, 0), NULL, pe_order_same_node|pe_order_then_cancels_first, data_set); // Certain checks need allowed nodes if (check_unfencing || check_utilization || rsc->container) { allowed_nodes = allowed_nodes_as_list(rsc, data_set); } if (check_unfencing) { /* Check if the node needs to be unfenced first */ for (GList *item = allowed_nodes; item; item = item->next) { pe_node_t *node = item->data; pe_action_t *unfence = pe_fence_op(node, "on", TRUE, NULL, FALSE, data_set); crm_debug("Ordering any stops of %s before %s, and any starts after", rsc->id, unfence->uuid); /* * It would be more efficient to order clone resources once, * rather than order each instance, but ordering the instance * allows us to avoid unnecessary dependencies that might conflict * with user constraints. * * @TODO: This constraint can still produce a transition loop if the * resource has a stop scheduled on the node being unfenced, and * there is a user ordering constraint to start some other resource * (which will be ordered after the unfence) before stopping this * resource. An example is "start some slow-starting cloned service * before stopping an associated virtual IP that may be moving to * it": * stop this -> unfencing -> start that -> stop this */ pcmk__new_ordering(rsc, stop_key(rsc), NULL, NULL, strdup(unfence->uuid), unfence, pe_order_optional|pe_order_same_node, data_set); pcmk__new_ordering(NULL, strdup(unfence->uuid), unfence, rsc, start_key(rsc), NULL, pe_order_implies_then_on_node|pe_order_same_node, data_set); } } if (check_utilization) { pcmk__create_utilization_constraints(rsc, allowed_nodes); } if (rsc->container) { pe_resource_t *remote_rsc = NULL; if (rsc->is_remote_node) { // rsc is the implicit remote connection for a guest or bundle node /* Do not allow a guest resource to live on a Pacemaker Remote node, * to avoid nesting remotes. However, allow bundles to run on remote * nodes. */ if (!pcmk_is_set(rsc->flags, pe_rsc_allow_remote_remotes)) { rsc_avoids_remote_nodes(rsc->container); } /* If someone cleans up a guest or bundle node's container, we will * likely schedule a (re-)probe of the container and recovery of the * connection. Order the connection stop after the container probe, * so that if we detect the container running, we will trigger a new * transition and avoid the unnecessary recovery. */ pcmk__order_resource_actions(rsc->container, RSC_STATUS, rsc, RSC_STOP, pe_order_optional, data_set); /* A user can specify that a resource must start on a Pacemaker Remote * node by explicitly configuring it with the container=NODENAME * meta-attribute. This is of questionable merit, since location * constraints can accomplish the same thing. But we support it, so here * we check whether a resource (that is not itself a remote connection) * has container set to a remote node or guest node resource. */ } else if (rsc->container->is_remote_node) { remote_rsc = rsc->container; } else { remote_rsc = pe__resource_contains_guest_node(data_set, rsc->container); } if (remote_rsc) { /* Force the resource on the Pacemaker Remote node instead of * colocating the resource with the container resource. */ for (GList *item = allowed_nodes; item; item = item->next) { pe_node_t *node = item->data; if (node->details->remote_rsc != remote_rsc) { node->weight = -INFINITY; } } } else { /* This resource is either a filler for a container that does NOT * represent a Pacemaker Remote node, or a Pacemaker Remote * connection resource for a guest node or bundle. */ int score; crm_trace("Order and colocate %s relative to its container %s", rsc->id, rsc->container->id); pcmk__new_ordering(rsc->container, pcmk__op_key(rsc->container->id, RSC_START, 0), NULL, rsc, pcmk__op_key(rsc->id, RSC_START, 0), NULL, pe_order_implies_then|pe_order_runnable_left, data_set); pcmk__new_ordering(rsc, pcmk__op_key(rsc->id, RSC_STOP, 0), NULL, rsc->container, pcmk__op_key(rsc->container->id, RSC_STOP, 0), NULL, pe_order_implies_first, data_set); if (pcmk_is_set(rsc->flags, pe_rsc_allow_remote_remotes)) { score = 10000; /* Highly preferred but not essential */ } else { score = INFINITY; /* Force them to run on the same host */ } pcmk__new_colocation("resource-with-container", NULL, score, rsc, rsc->container, NULL, NULL, true, data_set); } } if (rsc->is_remote_node || pcmk_is_set(rsc->flags, pe_rsc_fence_device)) { /* don't allow remote nodes to run stonith devices * or remote connection resources.*/ rsc_avoids_remote_nodes(rsc); } g_list_free(allowed_nodes); } void native_rsc_colocation_lh(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, pe_working_set_t *data_set) { if (dependent == NULL) { pe_err("dependent was NULL for %s", constraint->id); return; } else if (constraint->primary == NULL) { pe_err("primary was NULL for %s", constraint->id); return; } pe_rsc_trace(dependent, "Processing colocation constraint between %s and %s", dependent->id, primary->id); primary->cmds->rsc_colocation_rh(dependent, primary, constraint, data_set); } void native_rsc_colocation_rh(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, pe_working_set_t *data_set) { enum pcmk__coloc_affects filter_results; CRM_ASSERT((dependent != NULL) && (primary != NULL)); filter_results = pcmk__colocation_affects(dependent, primary, constraint, false); pe_rsc_trace(dependent, "%s %s with %s (%s, score=%d, filter=%d)", ((constraint->score > 0)? "Colocating" : "Anti-colocating"), dependent->id, primary->id, constraint->id, constraint->score, filter_results); switch (filter_results) { case pcmk__coloc_affects_role: pcmk__apply_coloc_to_priority(dependent, primary, constraint); break; case pcmk__coloc_affects_location: pcmk__apply_coloc_to_weights(dependent, primary, constraint); break; case pcmk__coloc_affects_nothing: default: return; } } enum pe_action_flags native_action_flags(pe_action_t * action, pe_node_t * node) { return action->flags; } static inline bool is_primitive_action(pe_action_t *action) { return action && action->rsc && (action->rsc->variant == pe_native); } /*! * \internal * \brief Clear a single action flag and set reason text * * \param[in] action Action whose flag should be cleared * \param[in] flag Action flag that should be cleared * \param[in] reason Action that is the reason why flag is being cleared */ #define clear_action_flag_because(action, flag, reason) do { \ if (pcmk_is_set((action)->flags, (flag))) { \ pe__clear_action_flags(action, flag); \ if ((action)->rsc != (reason)->rsc) { \ char *reason_text = pe__action2reason((reason), (flag)); \ pe_action_set_reason((action), reason_text, \ ((flag) == pe_action_migrate_runnable)); \ free(reason_text); \ } \ } \ } while (0) /*! * \internal * \brief Set action bits appropriately when pe_restart_order is used * * \param[in] first 'First' action in an ordering with pe_restart_order * \param[in] then 'Then' action in an ordering with pe_restart_order * \param[in] filter What ordering flags to care about * * \note pe_restart_order is set for "stop resource before starting it" and * "stop later group member before stopping earlier group member" */ static void handle_restart_ordering(pe_action_t *first, pe_action_t *then, enum pe_action_flags filter) { const char *reason = NULL; CRM_ASSERT(is_primitive_action(first)); CRM_ASSERT(is_primitive_action(then)); // We need to update the action in two cases: // ... if 'then' is required if (pcmk_is_set(filter, pe_action_optional) && !pcmk_is_set(then->flags, pe_action_optional)) { reason = "restart"; } /* ... if 'then' is unrunnable action on same resource (if a resource * should restart but can't start, we still want to stop) */ if (pcmk_is_set(filter, pe_action_runnable) && !pcmk_is_set(then->flags, pe_action_runnable) && pcmk_is_set(then->rsc->flags, pe_rsc_managed) && (first->rsc == then->rsc)) { reason = "stop"; } if (reason == NULL) { return; } pe_rsc_trace(first->rsc, "Handling %s -> %s for %s", first->uuid, then->uuid, reason); // Make 'first' required if it is runnable if (pcmk_is_set(first->flags, pe_action_runnable)) { clear_action_flag_because(first, pe_action_optional, then); } // Make 'first' required if 'then' is required if (!pcmk_is_set(then->flags, pe_action_optional)) { clear_action_flag_because(first, pe_action_optional, then); } // Make 'first' unmigratable if 'then' is unmigratable if (!pcmk_is_set(then->flags, pe_action_migrate_runnable)) { clear_action_flag_because(first, pe_action_migrate_runnable, then); } // Make 'then' unrunnable if 'first' is required but unrunnable if (!pcmk_is_set(first->flags, pe_action_optional) && !pcmk_is_set(first->flags, pe_action_runnable)) { clear_action_flag_because(then, pe_action_runnable, first); } } /* \param[in] flags Flags from action_flags_for_ordering() */ enum pe_graph_flags native_update_actions(pe_action_t *first, pe_action_t *then, pe_node_t *node, enum pe_action_flags flags, enum pe_action_flags filter, enum pe_ordering type, pe_working_set_t *data_set) { enum pe_graph_flags changed = pe_graph_none; enum pe_action_flags then_flags = then->flags; enum pe_action_flags first_flags = first->flags; if (type & pe_order_asymmetrical) { pe_resource_t *then_rsc = then->rsc; enum rsc_role_e then_rsc_role = then_rsc ? then_rsc->fns->state(then_rsc, TRUE) : 0; if (!then_rsc) { /* ignore */ } else if ((then_rsc_role == RSC_ROLE_STOPPED) && pcmk__str_eq(then->task, RSC_STOP, pcmk__str_casei)) { /* ignore... if 'then' is supposed to be stopped after 'first', but * then is already stopped, there is nothing to be done when non-symmetrical. */ } else if ((then_rsc_role >= RSC_ROLE_STARTED) && pcmk__str_eq(then->task, RSC_START, pcmk__str_casei) && pcmk_is_set(then->flags, pe_action_optional) && then->node && pcmk__list_of_1(then_rsc->running_on) && then->node->details == ((pe_node_t *) then_rsc->running_on->data)->details) { /* Ignore. If 'then' is supposed to be started after 'first', but * 'then' is already started, there is nothing to be done when * asymmetrical -- unless the start is mandatory, which indicates * the resource is restarting, and the ordering is still needed. */ } else if (!(first->flags & pe_action_runnable)) { /* prevent 'then' action from happening if 'first' is not runnable and * 'then' has not yet occurred. */ clear_action_flag_because(then, pe_action_optional, first); clear_action_flag_because(then, pe_action_runnable, first); } else { /* ignore... then is allowed to start/stop if it wants to. */ } } if (pcmk_is_set(type, pe_order_implies_first) && !pcmk_is_set(then_flags, pe_action_optional)) { // Then is required, and implies first should be, too if (pcmk_is_set(filter, pe_action_optional) && !pcmk_is_set(flags, pe_action_optional) && pcmk_is_set(first_flags, pe_action_optional)) { clear_action_flag_because(first, pe_action_optional, then); } if (pcmk_is_set(flags, pe_action_migrate_runnable) && !pcmk_is_set(then->flags, pe_action_migrate_runnable)) { clear_action_flag_because(first, pe_action_migrate_runnable, then); } } if (type & pe_order_promoted_implies_first) { if ((filter & pe_action_optional) && ((then->flags & pe_action_optional) == FALSE) && (then->rsc != NULL) && (then->rsc->role == RSC_ROLE_PROMOTED)) { clear_action_flag_because(first, pe_action_optional, then); if (pcmk_is_set(first->flags, pe_action_migrate_runnable) && !pcmk_is_set(then->flags, pe_action_migrate_runnable)) { clear_action_flag_because(first, pe_action_migrate_runnable, then); } } } if ((type & pe_order_implies_first_migratable) && pcmk_is_set(filter, pe_action_optional)) { if (((then->flags & pe_action_migrate_runnable) == FALSE) || ((then->flags & pe_action_runnable) == FALSE)) { clear_action_flag_because(first, pe_action_runnable, then); } if ((then->flags & pe_action_optional) == 0) { clear_action_flag_because(first, pe_action_optional, then); } } if ((type & pe_order_pseudo_left) && pcmk_is_set(filter, pe_action_optional)) { if ((first->flags & pe_action_runnable) == FALSE) { clear_action_flag_because(then, pe_action_migrate_runnable, first); pe__clear_action_flags(then, pe_action_pseudo); } } if (pcmk_is_set(type, pe_order_runnable_left) && pcmk_is_set(filter, pe_action_runnable) && pcmk_is_set(then->flags, pe_action_runnable) && !pcmk_is_set(flags, pe_action_runnable)) { clear_action_flag_because(then, pe_action_runnable, first); clear_action_flag_because(then, pe_action_migrate_runnable, first); } if (pcmk_is_set(type, pe_order_implies_then) && pcmk_is_set(filter, pe_action_optional) && pcmk_is_set(then->flags, pe_action_optional) && !pcmk_is_set(flags, pe_action_optional) && !pcmk_is_set(first->flags, pe_action_migrate_runnable)) { clear_action_flag_because(then, pe_action_optional, first); } if (pcmk_is_set(type, pe_order_restart)) { handle_restart_ordering(first, then, filter); } if (then_flags != then->flags) { pe__set_graph_flags(changed, first, pe_graph_updated_then); pe_rsc_trace(then->rsc, "%s on %s: flags are now %#.6x (was %#.6x) " "because of 'first' %s (%#.6x)", then->uuid, then->node? then->node->details->uname : "no node", then->flags, then_flags, first->uuid, first->flags); if(then->rsc && then->rsc->parent) { /* "X_stop then X_start" doesn't get handled for cloned groups unless we do this */ pcmk__update_action_for_orderings(then, data_set); } } if (first_flags != first->flags) { pe__set_graph_flags(changed, first, pe_graph_updated_first); pe_rsc_trace(first->rsc, "%s on %s: flags are now %#.6x (was %#.6x) " "because of 'then' %s (%#.6x)", first->uuid, first->node? first->node->details->uname : "no node", first->flags, first_flags, then->uuid, then->flags); } return changed; } void native_rsc_location(pe_resource_t *rsc, pe__location_t *constraint) { pcmk__apply_location(constraint, rsc); } void native_expand(pe_resource_t * rsc, pe_working_set_t * data_set) { GList *gIter = NULL; CRM_ASSERT(rsc); pe_rsc_trace(rsc, "Processing actions from %s", rsc->id); for (gIter = rsc->actions; gIter != NULL; gIter = gIter->next) { pe_action_t *action = (pe_action_t *) gIter->data; crm_trace("processing action %d for rsc=%s", action->id, rsc->id); pcmk__add_action_to_graph(action, data_set); } for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->cmds->expand(child_rsc, data_set); } } /*! * \internal * \brief Check whether a node is a multiply active resource's expected node * * \param[in] rsc Resource to check * \param[in] node Node to check * * \return true if \p rsc is multiply active with multiple-active set to * stop_unexpected, and \p node is the node where it will remain active * \note This assumes that the resource's next role cannot be changed to stopped * after this is called, which should be reasonable if status has already * been unpacked and resources have been assigned to nodes. */ static bool is_expected_node(const pe_resource_t *rsc, const pe_node_t *node) { return pcmk_all_flags_set(rsc->flags, pe_rsc_stop_unexpected|pe_rsc_restarting) && (rsc->next_role > RSC_ROLE_STOPPED) && (rsc->allocated_to != NULL) && (node != NULL) && (rsc->allocated_to->details == node->details); } gboolean StopRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { GList *gIter = NULL; CRM_ASSERT(rsc); for (gIter = rsc->running_on; gIter != NULL; gIter = gIter->next) { pe_node_t *current = (pe_node_t *) gIter->data; pe_action_t *stop; if (is_expected_node(rsc, current)) { /* We are scheduling restart actions for a multiply active resource * with multiple-active=stop_unexpected, and this is where it should * not be stopped. */ pe_rsc_trace(rsc, "Skipping stop of multiply active resource %s " "on expected node %s", rsc->id, current->details->uname); continue; } if (rsc->partial_migration_target) { if (rsc->partial_migration_target->details == current->details // Only if the allocated node still is the migration target. && rsc->allocated_to && rsc->allocated_to->details == rsc->partial_migration_target->details) { pe_rsc_trace(rsc, "Skipping stop of %s on %s " "because migration to %s in progress", rsc->id, current->details->uname, next->details->uname); continue; } else { pe_rsc_trace(rsc, "Forcing stop of %s on %s " "because migration target changed", rsc->id, current->details->uname); optional = FALSE; } } pe_rsc_trace(rsc, "Scheduling stop of %s on %s", rsc->id, current->details->uname); stop = stop_action(rsc, current, optional); if(rsc->allocated_to == NULL) { pe_action_set_reason(stop, "node availability", TRUE); } else if (pcmk_all_flags_set(rsc->flags, pe_rsc_restarting |pe_rsc_stop_unexpected)) { /* We are stopping a multiply active resource on a node that is * not its expected node, and we are still scheduling restart * actions, so the stop is for being multiply active. */ pe_action_set_reason(stop, "being multiply active", TRUE); } if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) { pe__clear_action_flags(stop, pe_action_runnable); } if (pcmk_is_set(data_set->flags, pe_flag_remove_after_stop)) { DeleteRsc(rsc, current, optional, data_set); } if (pcmk_is_set(rsc->flags, pe_rsc_needs_unfencing)) { pe_action_t *unfence = pe_fence_op(current, "on", TRUE, NULL, FALSE, data_set); order_actions(stop, unfence, pe_order_implies_first); if (!pcmk__node_unfenced(current)) { pe_proc_err("Stopping %s until %s can be unfenced", rsc->id, current->details->uname); } } } return TRUE; } gboolean StartRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { pe_action_t *start = NULL; CRM_ASSERT(rsc); pe_rsc_trace(rsc, "Scheduling %s start of %s on %s (weight=%d)", (optional? "optional" : "required"), rsc->id, ((next == NULL)? "N/A" : next->details->uname), ((next == NULL)? 0 : next->weight)); start = start_action(rsc, next, TRUE); pcmk__order_vs_unfence(rsc, next, start, pe_order_implies_then, data_set); if (pcmk_is_set(start->flags, pe_action_runnable) && !optional) { pe__clear_action_flags(start, pe_action_optional); } if (is_expected_node(rsc, next)) { /* This could be a problem if the start becomes necessary for other * reasons later. */ pe_rsc_trace(rsc, "Start of multiply active resouce %s " "on expected node %s will be a pseudo-action", rsc->id, next->details->uname); pe__set_action_flags(start, pe_action_pseudo); } return TRUE; } gboolean PromoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { GList *gIter = NULL; gboolean runnable = TRUE; GList *action_list = NULL; CRM_ASSERT(rsc); CRM_CHECK(next != NULL, return FALSE); pe_rsc_trace(rsc, "%s on %s", rsc->id, next->details->uname); action_list = pe__resource_actions(rsc, next, RSC_START, TRUE); for (gIter = action_list; gIter != NULL; gIter = gIter->next) { pe_action_t *start = (pe_action_t *) gIter->data; if (!pcmk_is_set(start->flags, pe_action_runnable)) { runnable = FALSE; } } g_list_free(action_list); if (runnable) { pe_action_t *promote = promote_action(rsc, next, optional); if (is_expected_node(rsc, next)) { /* This could be a problem if the promote becomes necessary for * other reasons later. */ pe_rsc_trace(rsc, "Promotion of multiply active resouce %s " "on expected node %s will be a pseudo-action", rsc->id, next->details->uname); pe__set_action_flags(promote, pe_action_pseudo); } return TRUE; } pe_rsc_debug(rsc, "%s\tPromote %s (canceled)", next->details->uname, rsc->id); action_list = pe__resource_actions(rsc, next, RSC_PROMOTE, TRUE); for (gIter = action_list; gIter != NULL; gIter = gIter->next) { pe_action_t *promote = (pe_action_t *) gIter->data; pe__clear_action_flags(promote, pe_action_runnable); } g_list_free(action_list); return TRUE; } gboolean DemoteRsc(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { GList *gIter = NULL; CRM_ASSERT(rsc); if (is_expected_node(rsc, next)) { pe_rsc_trace(rsc, "Skipping demote of multiply active resource %s " "on expected node %s", rsc->id, next->details->uname); return TRUE; } pe_rsc_trace(rsc, "%s", rsc->id); /* CRM_CHECK(rsc->next_role == RSC_ROLE_UNPROMOTED, return FALSE); */ for (gIter = rsc->running_on; gIter != NULL; gIter = gIter->next) { pe_node_t *current = (pe_node_t *) gIter->data; pe_rsc_trace(rsc, "%s on %s", rsc->id, next ? next->details->uname : "N/A"); demote_action(rsc, current, optional); } return TRUE; } gboolean RoleError(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { CRM_ASSERT(rsc); crm_err("%s on %s", rsc->id, next ? next->details->uname : "N/A"); CRM_CHECK(FALSE, return FALSE); return FALSE; } gboolean NullOp(pe_resource_t * rsc, pe_node_t * next, gboolean optional, pe_working_set_t * data_set) { CRM_ASSERT(rsc); pe_rsc_trace(rsc, "%s", rsc->id); return FALSE; } gboolean DeleteRsc(pe_resource_t * rsc, pe_node_t * node, gboolean optional, pe_working_set_t * data_set) { if (pcmk_is_set(rsc->flags, pe_rsc_failed)) { pe_rsc_trace(rsc, "Resource %s not deleted from %s: failed", rsc->id, node->details->uname); return FALSE; } else if (node == NULL) { pe_rsc_trace(rsc, "Resource %s not deleted: NULL node", rsc->id); return FALSE; } else if (node->details->unclean || node->details->online == FALSE) { pe_rsc_trace(rsc, "Resource %s not deleted from %s: unrunnable", rsc->id, node->details->uname); return FALSE; } crm_notice("Removing %s from %s", rsc->id, node->details->uname); delete_action(rsc, node, optional); pcmk__order_resource_actions(rsc, RSC_STOP, rsc, RSC_DELETE, optional? pe_order_implies_then : pe_order_optional, data_set); pcmk__order_resource_actions(rsc, RSC_DELETE, rsc, RSC_START, optional? pe_order_implies_then : pe_order_optional, data_set); return TRUE; } gboolean native_create_probe(pe_resource_t * rsc, pe_node_t * node, pe_action_t * complete, gboolean force, pe_working_set_t * data_set) { enum pe_ordering flags = pe_order_optional; char *key = NULL; pe_action_t *probe = NULL; pe_node_t *running = NULL; pe_node_t *allowed = NULL; pe_resource_t *top = uber_parent(rsc); static const char *rc_promoted = NULL; static const char *rc_inactive = NULL; if (rc_inactive == NULL) { rc_inactive = pcmk__itoa(PCMK_OCF_NOT_RUNNING); rc_promoted = pcmk__itoa(PCMK_OCF_RUNNING_PROMOTED); } CRM_CHECK(node != NULL, return FALSE); if (!force && !pcmk_is_set(data_set->flags, pe_flag_startup_probes)) { pe_rsc_trace(rsc, "Skipping active resource detection for %s", rsc->id); return FALSE; } if (pe__is_guest_or_remote_node(node)) { const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); if (pcmk__str_eq(class, PCMK_RESOURCE_CLASS_STONITH, pcmk__str_casei)) { pe_rsc_trace(rsc, "Skipping probe for %s on %s because Pacemaker Remote nodes cannot run stonith agents", rsc->id, node->details->id); return FALSE; } else if (pe__is_guest_node(node) && pe__resource_contains_guest_node(data_set, rsc)) { pe_rsc_trace(rsc, "Skipping probe for %s on %s because guest nodes cannot run resources containing guest nodes", rsc->id, node->details->id); return FALSE; } else if (rsc->is_remote_node) { pe_rsc_trace(rsc, "Skipping probe for %s on %s because Pacemaker Remote nodes cannot host remote connections", rsc->id, node->details->id); return FALSE; } } if (rsc->children) { GList *gIter = NULL; gboolean any_created = FALSE; for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; any_created = child_rsc->cmds->create_probe(child_rsc, node, complete, force, data_set) || any_created; } return any_created; } else if ((rsc->container) && (!rsc->is_remote_node)) { pe_rsc_trace(rsc, "Skipping %s: it is within container %s", rsc->id, rsc->container->id); return FALSE; } if (pcmk_is_set(rsc->flags, pe_rsc_orphan)) { pe_rsc_trace(rsc, "Skipping orphan: %s", rsc->id); return FALSE; } // Check whether resource is already known on node if (!force && g_hash_table_lookup(rsc->known_on, node->details->id)) { pe_rsc_trace(rsc, "Skipping known: %s on %s", rsc->id, node->details->uname); return FALSE; } allowed = g_hash_table_lookup(rsc->allowed_nodes, node->details->id); if (rsc->exclusive_discover || top->exclusive_discover) { if (allowed == NULL) { /* exclusive discover is enabled and this node is not in the allowed list. */ pe_rsc_trace(rsc, "Skipping probe for %s on node %s, A", rsc->id, node->details->id); return FALSE; } else if (allowed->rsc_discover_mode != pe_discover_exclusive) { /* exclusive discover is enabled and this node is not marked * as a node this resource should be discovered on */ pe_rsc_trace(rsc, "Skipping probe for %s on node %s, B", rsc->id, node->details->id); return FALSE; } } if(allowed == NULL && node->rsc_discover_mode == pe_discover_never) { /* If this node was allowed to host this resource it would * have been explicitly added to the 'allowed_nodes' list. * However it wasn't and the node has discovery disabled, so * no need to probe for this resource. */ pe_rsc_trace(rsc, "Skipping probe for %s on node %s, C", rsc->id, node->details->id); return FALSE; } if (allowed && allowed->rsc_discover_mode == pe_discover_never) { /* this resource is marked as not needing to be discovered on this node */ pe_rsc_trace(rsc, "Skipping probe for %s on node %s, discovery mode", rsc->id, node->details->id); return FALSE; } if (pe__is_guest_node(node)) { pe_resource_t *remote = node->details->remote_rsc->container; if(remote->role == RSC_ROLE_STOPPED) { /* If the container is stopped, then we know anything that * might have been inside it is also stopped and there is * no need to probe. * * If we don't know the container's state on the target * either: * * - the container is running, the transition will abort * and we'll end up in a different case next time, or * * - the container is stopped * * Either way there is no need to probe. * */ if(remote->allocated_to && g_hash_table_lookup(remote->known_on, remote->allocated_to->details->id) == NULL) { /* For safety, we order the 'rsc' start after 'remote' * has been probed. * * Using 'top' helps for groups, but we may need to * follow the start's ordering chain backwards. */ pcmk__new_ordering(remote, pcmk__op_key(remote->id, RSC_STATUS, 0), NULL, top, pcmk__op_key(top->id, RSC_START, 0), NULL, pe_order_optional, data_set); } pe_rsc_trace(rsc, "Skipping probe for %s on node %s, %s is stopped", rsc->id, node->details->id, remote->id); return FALSE; /* Here we really we want to check if remote->stop is required, * but that information doesn't exist yet */ } else if(node->details->remote_requires_reset || node->details->unclean || pcmk_is_set(remote->flags, pe_rsc_failed) || remote->next_role == RSC_ROLE_STOPPED || (remote->allocated_to && pe_find_node(remote->running_on, remote->allocated_to->details->uname) == NULL) ) { /* The container is stopping or restarting, don't start * 'rsc' until 'remote' stops as this also implies that * 'rsc' is stopped - avoiding the need to probe */ pcmk__new_ordering(remote, pcmk__op_key(remote->id, RSC_STOP, 0), NULL, top, pcmk__op_key(top->id, RSC_START, 0), NULL, pe_order_optional, data_set); pe_rsc_trace(rsc, "Skipping probe for %s on node %s, %s is stopping, restarting or moving", rsc->id, node->details->id, remote->id); return FALSE; /* } else { * The container is running so there is no problem probing it */ } } key = pcmk__op_key(rsc->id, RSC_STATUS, 0); probe = custom_action(rsc, key, RSC_STATUS, node, FALSE, TRUE, data_set); pe__clear_action_flags(probe, pe_action_optional); pcmk__order_vs_unfence(rsc, node, probe, pe_order_optional, data_set); /* * We need to know if it's running_on (not just known_on) this node * to correctly determine the target rc. */ running = pe_find_node_id(rsc->running_on, node->details->id); if (running == NULL) { add_hash_param(probe->meta, XML_ATTR_TE_TARGET_RC, rc_inactive); } else if (rsc->role == RSC_ROLE_PROMOTED) { add_hash_param(probe->meta, XML_ATTR_TE_TARGET_RC, rc_promoted); } crm_debug("Probing %s on %s (%s) %d %p", rsc->id, node->details->uname, role2text(rsc->role), pcmk_is_set(probe->flags, pe_action_runnable), rsc->running_on); if ((pcmk_is_set(rsc->flags, pe_rsc_fence_device) && pcmk_is_set(data_set->flags, pe_flag_enable_unfencing)) || !pe_rsc_is_clone(top)) { top = rsc; } else { crm_trace("Probing %s on %s (%s) as %s", rsc->id, node->details->uname, role2text(rsc->role), top->id); } if (!pcmk_is_set(probe->flags, pe_action_runnable) && (rsc->running_on == NULL)) { /* Prevent the start from occurring if rsc isn't active, but * don't cause it to stop if it was active already */ pe__set_order_flags(flags, pe_order_runnable_left); } pcmk__new_ordering(rsc, NULL, probe, top, pcmk__op_key(top->id, RSC_START, 0), NULL, flags, data_set); // Order the probe before any agent reload pcmk__new_ordering(rsc, NULL, probe, top, reload_key(rsc), NULL, pe_order_optional, data_set); return TRUE; } void native_append_meta(pe_resource_t * rsc, xmlNode * xml) { char *value = g_hash_table_lookup(rsc->meta, XML_RSC_ATTR_INCARNATION); pe_resource_t *parent; if (value) { char *name = NULL; name = crm_meta_name(XML_RSC_ATTR_INCARNATION); crm_xml_add(xml, name, value); free(name); } value = g_hash_table_lookup(rsc->meta, XML_RSC_ATTR_REMOTE_NODE); if (value) { char *name = NULL; name = crm_meta_name(XML_RSC_ATTR_REMOTE_NODE); crm_xml_add(xml, name, value); free(name); } for (parent = rsc; parent != NULL; parent = parent->parent) { if (parent->container) { crm_xml_add(xml, CRM_META"_"XML_RSC_ATTR_CONTAINER, parent->container->id); } } } // Primitive implementation of resource_alloc_functions_t:add_utilization() void pcmk__primitive_add_utilization(pe_resource_t *rsc, pe_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization) { if (!pcmk_is_set(rsc->flags, pe_rsc_provisional)) { return; } pe_rsc_trace(orig_rsc, "%s: Adding primitive %s as colocated utilization", orig_rsc->id, rsc->id); pcmk__release_node_capacity(utilization, rsc); } /*! * \internal * \brief Get epoch time of node's shutdown attribute (or now if none) * * \param[in] node Node to check * \param[in] data_set Cluster working set * * \return Epoch time corresponding to shutdown attribute if set or now if not */ static time_t shutdown_time(pe_node_t *node, pe_working_set_t *data_set) { const char *shutdown = pe_node_attribute_raw(node, XML_CIB_ATTR_SHUTDOWN); time_t result = 0; if (shutdown != NULL) { long long result_ll; if (pcmk__scan_ll(shutdown, &result_ll, 0LL) == pcmk_rc_ok) { result = (time_t) result_ll; } } return (result == 0)? get_effective_time(data_set) : result; } // Primitive implementation of resource_alloc_functions_t:shutdown_lock() void pcmk__primitive_shutdown_lock(pe_resource_t *rsc) { const char *class = crm_element_value(rsc->xml, XML_AGENT_ATTR_CLASS); // Fence devices and remote connections can't be locked if (pcmk__str_eq(class, PCMK_RESOURCE_CLASS_STONITH, pcmk__str_null_matches) || pe__resource_is_remote_conn(rsc, rsc->cluster)) { return; } if (rsc->lock_node != NULL) { // The lock was obtained from resource history if (rsc->running_on != NULL) { /* The resource was started elsewhere even though it is now * considered locked. This shouldn't be possible, but as a * failsafe, we don't want to disturb the resource now. */ pe_rsc_info(rsc, "Cancelling shutdown lock because %s is already active", rsc->id); pe__clear_resource_history(rsc, rsc->lock_node, rsc->cluster); rsc->lock_node = NULL; rsc->lock_time = 0; } // Only a resource active on exactly one node can be locked } else if (pcmk__list_of_1(rsc->running_on)) { pe_node_t *node = rsc->running_on->data; if (node->details->shutdown) { if (node->details->unclean) { pe_rsc_debug(rsc, "Not locking %s to unclean %s for shutdown", rsc->id, node->details->uname); } else { rsc->lock_node = node; rsc->lock_time = shutdown_time(node, rsc->cluster); } } } if (rsc->lock_node == NULL) { // No lock needed return; } if (rsc->cluster->shutdown_lock > 0) { time_t lock_expiration = rsc->lock_time + rsc->cluster->shutdown_lock; pe_rsc_info(rsc, "Locking %s to %s due to shutdown (expires @%lld)", rsc->id, rsc->lock_node->details->uname, (long long) lock_expiration); pe__update_recheck_time(++lock_expiration, rsc->cluster); } else { pe_rsc_info(rsc, "Locking %s to %s due to shutdown", rsc->id, rsc->lock_node->details->uname); } // If resource is locked to one node, ban it from all other nodes for (GList *item = rsc->cluster->nodes; item != NULL; item = item->next) { pe_node_t *node = item->data; if (strcmp(node->details->uname, rsc->lock_node->details->uname)) { resource_location(rsc, node, -CRM_SCORE_INFINITY, XML_CONFIG_ATTR_SHUTDOWN_LOCK, rsc->cluster); } } } diff --git a/lib/pacemaker/pcmk_sched_promotable.c b/lib/pacemaker/pcmk_sched_promotable.c index c33e3a3aa1..b7e08ef83a 100644 --- a/lib/pacemaker/pcmk_sched_promotable.c +++ b/lib/pacemaker/pcmk_sched_promotable.c @@ -1,1019 +1,1182 @@ /* * Copyright 2004-2022 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU General Public License version 2 * or later (GPLv2+) WITHOUT ANY WARRANTY. */ #include #include #include #include "libpacemaker_private.h" #define VARIANT_CLONE 1 #include /*! * \internal * \brief Add implicit promotion ordering for a promotable instance * * \param[in] clone Clone resource * \param[in] child Instance of \p clone being ordered * \param[in] last Previous instance ordered (NULL if \p child is first) */ static void order_instance_promotion(pe_resource_t *clone, pe_resource_t *child, pe_resource_t *last) { // "Promote clone" -> promote instance -> "clone promoted" pcmk__order_resource_actions(clone, RSC_PROMOTE, child, RSC_PROMOTE, pe_order_optional, clone->cluster); pcmk__order_resource_actions(child, RSC_PROMOTE, clone, RSC_PROMOTED, pe_order_optional, clone->cluster); // If clone is ordered, order this instance relative to last if ((last != NULL) && pe__clone_is_ordered(clone)) { pcmk__order_resource_actions(last, RSC_PROMOTE, child, RSC_PROMOTE, pe_order_optional, clone->cluster); } } /*! * \internal * \brief Add implicit demotion ordering for a promotable instance * * \param[in] clone Clone resource * \param[in] child Instance of \p clone being ordered * \param[in] last Previous instance ordered (NULL if \p child is first) */ static void order_instance_demotion(pe_resource_t *clone, pe_resource_t *child, pe_resource_t *last) { // "Demote clone" -> demote instance -> "clone demoted" pcmk__order_resource_actions(clone, RSC_DEMOTE, child, RSC_DEMOTE, pe_order_implies_first_printed, clone->cluster); pcmk__order_resource_actions(child, RSC_DEMOTE, clone, RSC_DEMOTED, pe_order_implies_then_printed, clone->cluster); // If clone is ordered, order this instance relative to last if ((last != NULL) && pe__clone_is_ordered(clone)) { pcmk__order_resource_actions(child, RSC_DEMOTE, last, RSC_DEMOTE, pe_order_optional, clone->cluster); } } /*! * \internal * \brief Check whether an instance will be promoted or demoted * * \param[in] rsc Instance to check * \param[in] demoting If \p rsc will be demoted, this will be set to true * \param[in] promoting If \p rsc will be promoted, this will be set to true */ static void check_for_role_change(pe_resource_t *rsc, bool *demoting, bool *promoting) { GList *iter = NULL; // If this is a cloned group, check group members recursively if (rsc->children != NULL) { for (iter = rsc->children; iter != NULL; iter = iter->next) { check_for_role_change((pe_resource_t *) iter->data, demoting, promoting); } return; } for (iter = rsc->actions; iter != NULL; iter = iter->next) { pe_action_t *action = (pe_action_t *) iter->data; if (*promoting && *demoting) { return; } else if (pcmk_is_set(action->flags, pe_action_optional)) { continue; } else if (pcmk__str_eq(RSC_DEMOTE, action->task, pcmk__str_none)) { *demoting = true; } else if (pcmk__str_eq(RSC_PROMOTE, action->task, pcmk__str_none)) { *promoting = true; } } } /*! * \internal * \brief Add promoted-role location constraint scores to an instance's priority * * Adjust a promotable clone instance's promotion priority by the scores of any * location constraints in a list that are both limited to the promoted role and * for the node where the instance will be placed. * * \param[in] child Promotable clone instance * \param[in] location_constraints List of location constraints to apply * \param[in] chosen Node where \p child will be placed */ static void apply_promoted_locations(pe_resource_t *child, GList *location_constraints, pe_node_t *chosen) { for (GList *iter = location_constraints; iter; iter = iter->next) { pe__location_t *location = iter->data; pe_node_t *weighted_node = NULL; if (location->role_filter == RSC_ROLE_PROMOTED) { weighted_node = pe_find_node_id(location->node_list_rh, chosen->details->id); } if (weighted_node != NULL) { int new_priority = pcmk__add_scores(child->priority, weighted_node->weight); pe_rsc_trace(child, "Applying location %s to %s promotion priority on %s: " "%d + %d = %d", location->id, child->id, weighted_node->details->uname, child->priority, weighted_node->weight, new_priority); child->priority = new_priority; } } } /*! * \internal * \brief Get the node that an instance will be promoted on * * \param[in] rsc Promotable clone instance to check * * \return Node that \p rsc will be promoted on, or NULL if none */ static pe_node_t * node_to_be_promoted_on(pe_resource_t *rsc) { pe_node_t *node = NULL; pe_node_t *local_node = NULL; pe_resource_t *parent = uber_parent(rsc); clone_variant_data_t *clone_data = NULL; // If this is a cloned group, bail if any group member can't be promoted for (GList *iter = rsc->children; iter != NULL; iter = iter->next) { pe_resource_t *child = (pe_resource_t *) iter->data; if (node_to_be_promoted_on(child) == NULL) { pe_rsc_trace(rsc, "%s can't be promoted because member %s can't", rsc->id, child->id); return NULL; } } node = rsc->fns->location(rsc, NULL, FALSE); if (node == NULL) { pe_rsc_trace(rsc, "%s can't be promoted because it won't be active", rsc->id); return NULL; } else if (!pcmk_is_set(rsc->flags, pe_rsc_managed)) { if (rsc->fns->state(rsc, TRUE) == RSC_ROLE_PROMOTED) { crm_notice("Unmanaged instance %s will be left promoted on %s", rsc->id, node->details->uname); } else { pe_rsc_trace(rsc, "%s can't be promoted because it is unmanaged", rsc->id); return NULL; } } else if (rsc->priority < 0) { pe_rsc_trace(rsc, "%s can't be promoted because its promotion priority %d " "is negative", rsc->id, rsc->priority); return NULL; } else if (!pcmk__node_available(node, false, true)) { pe_rsc_trace(rsc, "%s can't be promoted because %s can't run resources", rsc->id, node->details->uname); return NULL; } get_clone_variant_data(clone_data, parent); local_node = pe_hash_table_lookup(parent->allowed_nodes, node->details->id); if (local_node == NULL) { /* It should not be possible for the scheduler to have allocated the * instance to a node where its parent is not allowed, but it's good to * have a fail-safe. */ if (pcmk_is_set(rsc->flags, pe_rsc_managed)) { crm_warn("%s can't be promoted because %s is not allowed on %s " "(scheduler bug?)", rsc->id, parent->id, node->details->uname); } // else the instance is unmanaged and already promoted return NULL; } else if ((local_node->count >= clone_data->promoted_node_max) && pcmk_is_set(rsc->flags, pe_rsc_managed)) { pe_rsc_trace(rsc, "%s can't be promoted because %s has " "maximum promoted instances already", rsc->id, node->details->uname); return NULL; } return local_node; } /*! * \internal * \brief Compare two promotable clone instances by promotion priority * * \param[in] a First instance to compare * \param[in] b Second instance to compare * * \return A negative number if \p a has higher promotion priority, * a positive number if \p b has higher promotion priority, * or 0 if promotion priorities are equal */ static gint cmp_promotable_instance(gconstpointer a, gconstpointer b) { const pe_resource_t *rsc1 = (const pe_resource_t *) a; const pe_resource_t *rsc2 = (const pe_resource_t *) b; enum rsc_role_e role1 = RSC_ROLE_UNKNOWN; enum rsc_role_e role2 = RSC_ROLE_UNKNOWN; CRM_ASSERT((rsc1 != NULL) && (rsc2 != NULL)); // Check sort index set by pcmk__set_instance_roles() if (rsc1->sort_index > rsc2->sort_index) { pe_rsc_trace(rsc1, "%s has higher promotion priority than %s " "(sort index %d > %d)", rsc1->id, rsc2->id, rsc1->sort_index, rsc2->sort_index); return -1; } else if (rsc1->sort_index < rsc2->sort_index) { pe_rsc_trace(rsc1, "%s has lower promotion priority than %s " "(sort index %d < %d)", rsc1->id, rsc2->id, rsc1->sort_index, rsc2->sort_index); return 1; } // If those are the same, prefer instance whose current role is higher role1 = rsc1->fns->state(rsc1, TRUE); role2 = rsc2->fns->state(rsc2, TRUE); if (role1 > role2) { pe_rsc_trace(rsc1, "%s has higher promotion priority than %s " "(higher current role)", rsc1->id, rsc2->id); return -1; } else if (role1 < role2) { pe_rsc_trace(rsc1, "%s has lower promotion priority than %s " "(lower current role)", rsc1->id, rsc2->id); return 1; } // Finally, do normal clone instance sorting return pcmk__cmp_instance(a, b); } +/*! + * \internal + * \brief Add a promotable clone instance's sort index to its node's weight + * + * Add a promotable clone instance's sort index (which sums its promotion + * preferences and scores of relevant location constraints for the promoted + * role) to the node weight of the instance's allocated node. + * + * \param[in] data Promotable clone instance + * \param[in] user_data Clone parent of \p data + */ static void -promotion_order(pe_resource_t *rsc, pe_working_set_t *data_set) +add_sort_index_to_node_weight(gpointer data, gpointer user_data) { - GList *gIter = NULL; + pe_resource_t *child = (pe_resource_t *) data; + pe_resource_t *clone = (pe_resource_t *) user_data; + pe_node_t *node = NULL; pe_node_t *chosen = NULL; - if (pe__set_clone_flag(rsc, pe__clone_promotion_constrained) - == pcmk_rc_already) { + if (child->sort_index < 0) { + pe_rsc_trace(clone, "Not adding sort index of %s: negative", child->id); return; } - pe_rsc_trace(rsc, "Merging weights for %s", rsc->id); - pe__set_resource_flags(rsc, pe_rsc_merging); - - for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { - pe_resource_t *child = (pe_resource_t *) gIter->data; - pe_rsc_trace(rsc, "Sort index: %s = %d", child->id, child->sort_index); + chosen = child->fns->location(child, NULL, FALSE); + if (chosen == NULL) { + pe_rsc_trace(clone, "Not adding sort index of %s: inactive", child->id); + return; } - pe__show_node_weights(true, rsc, "Before", rsc->allowed_nodes, data_set); - gIter = rsc->children; - for (; gIter != NULL; gIter = gIter->next) { - pe_resource_t *child = (pe_resource_t *) gIter->data; + node = (pe_node_t *) pe_hash_table_lookup(clone->allowed_nodes, + chosen->details->id); + CRM_ASSERT(node != NULL); - chosen = child->fns->location(child, NULL, FALSE); - if (chosen == NULL || child->sort_index < 0) { - pe_rsc_trace(rsc, "Skipping %s", child->id); - continue; - } + pe_rsc_trace(clone, "Adding sort index %s of %s to weight for %s", + pcmk_readable_score(child->sort_index), child->id, + node->details->uname); + node->weight = pcmk__add_scores(child->sort_index, node->weight); +} - node = (pe_node_t *) pe_hash_table_lookup(rsc->allowed_nodes, chosen->details->id); - CRM_ASSERT(node != NULL); - // Add promotion preferences and rsc_location scores when role=Promoted - pe_rsc_trace(rsc, "Adding %s to %s from %s", - pcmk_readable_score(child->sort_index), - node->details->uname, child->id); - node->weight = pcmk__add_scores(child->sort_index, node->weight); +/*! + * \internal + * \brief Apply colocation to dependent's node weights if for promoted role + * + * \param[in] data Colocation constraint to apply + * \param[in] user_data Promotable clone that is constraint's dependent + */ +static void +apply_coloc_to_dependent(gpointer data, gpointer user_data) +{ + pcmk__colocation_t *constraint = (pcmk__colocation_t *) data; + pe_resource_t *clone = (pe_resource_t *) user_data; + enum pe_weights flags = 0; + + if (constraint->dependent_role != RSC_ROLE_PROMOTED) { + return; } + if (constraint->score < INFINITY) { + flags = pe_weights_rollback; + } + pe_rsc_trace(clone, "RHS: %s with %s: %d", + constraint->dependent->id, constraint->primary->id, + constraint->score); + pcmk__apply_colocation(constraint, clone, constraint->primary, flags); +} - pe__show_node_weights(true, rsc, "Middle", rsc->allowed_nodes, data_set); +/*! + * \internal + * \brief Apply colocation to primary's node weights if for promoted role + * + * \param[in] data Colocation constraint to apply + * \param[in] user_data Promotable clone that is constraint's primary + */ +static void +apply_coloc_to_primary(gpointer data, gpointer user_data) +{ + pcmk__colocation_t *constraint = (pcmk__colocation_t *) data; + pe_resource_t *clone = (pe_resource_t *) user_data; - gIter = rsc->rsc_cons; - for (; gIter != NULL; gIter = gIter->next) { - pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; + if ((constraint->primary_role != RSC_ROLE_PROMOTED) + || !pcmk__colocation_has_influence(constraint, NULL)) { + return; + } - /* (Re-)add location preferences of resources that a promoted instance - * should/must be colocated with. - */ - if (constraint->dependent_role == RSC_ROLE_PROMOTED) { - enum pe_weights flags = constraint->score == INFINITY ? 0 : pe_weights_rollback; - - pe_rsc_trace(rsc, "RHS: %s with %s: %d", - constraint->dependent->id, constraint->primary->id, - constraint->score); - rsc->allowed_nodes = constraint->primary->cmds->merge_weights( - constraint->primary, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, - constraint->score / (float) INFINITY, flags); - } + pe_rsc_trace(clone, "LHS: %s with %s: %d", + constraint->dependent->id, constraint->primary->id, + constraint->score); + pcmk__apply_colocation(constraint, clone, constraint->dependent, + pe_weights_rollback|pe_weights_positive); +} + +/*! + * \internal + * \brief Set clone instance's sort index to its node's weight + * + * \param[in] data Promotable clone instance + * \param[in] user_data Parent clone of \p data + */ +static void +set_sort_index_to_node_weight(gpointer data, gpointer user_data) +{ + pe_resource_t *child = (pe_resource_t *) data; + pe_resource_t *clone = (pe_resource_t *) user_data; + + pe_node_t *chosen = child->fns->location(child, NULL, FALSE); + + if (!pcmk_is_set(child->flags, pe_rsc_managed) + && (child->next_role == RSC_ROLE_PROMOTED)) { + child->sort_index = INFINITY; + pe_rsc_trace(clone, + "Final sort index for %s is INFINITY (unmanaged promoted)", + child->id); + + } else if ((chosen == NULL) || (child->sort_index < 0)) { + pe_rsc_trace(clone, + "Final sort index for %s is %d (ignoring node weight)", + child->id, child->sort_index); + + } else { + pe_node_t *node = NULL; + + node = (pe_node_t *) pe_hash_table_lookup(clone->allowed_nodes, + chosen->details->id); + CRM_ASSERT(node != NULL); + + child->sort_index = node->weight; + pe_rsc_trace(clone, + "Merging weights for %s: final sort index for %s is %d", + clone->id, child->id, child->sort_index); } +} - gIter = rsc->rsc_cons_lhs; - for (; gIter != NULL; gIter = gIter->next) { - pcmk__colocation_t *constraint = (pcmk__colocation_t *) gIter->data; +/*! + * \internal + * \brief Sort a promotable clone's instances by descending promotion priority + * + * \param[in] clone Promotable clone to sort + */ +static void +sort_promotable_instances(pe_resource_t *clone) +{ + if (pe__set_clone_flag(clone, pe__clone_promotion_constrained) + == pcmk_rc_already) { + return; + } + pe__set_resource_flags(clone, pe_rsc_merging); - if (!pcmk__colocation_has_influence(constraint, NULL)) { - continue; - } + for (GList *iter = clone->children; iter != NULL; iter = iter->next) { + pe_resource_t *child = (pe_resource_t *) iter->data; - /* (Re-)add location preferences of resources that wish to be colocated - * with a promoted instance. - */ - if (constraint->primary_role == RSC_ROLE_PROMOTED) { - pe_rsc_trace(rsc, "LHS: %s with %s: %d", - constraint->dependent->id, constraint->primary->id, - constraint->score); - rsc->allowed_nodes = constraint->dependent->cmds->merge_weights( - constraint->dependent, rsc->id, rsc->allowed_nodes, - constraint->node_attribute, - constraint->score / (float) INFINITY, - pe_weights_rollback|pe_weights_positive); - } + pe_rsc_trace(clone, + "Merging weights for %s: initial sort index for %s is %d", + clone->id, child->id, child->sort_index); } + pe__show_node_weights(true, clone, "Before", clone->allowed_nodes, + clone->cluster); + + g_list_foreach(clone->children, add_sort_index_to_node_weight, clone); + g_list_foreach(clone->rsc_cons, apply_coloc_to_dependent, clone); + g_list_foreach(clone->rsc_cons_lhs, apply_coloc_to_primary, clone); // Ban resource from all nodes if it needs a ticket but doesn't have it - pcmk__require_promotion_tickets(rsc); + pcmk__require_promotion_tickets(clone); - pe__show_node_weights(true, rsc, "After", rsc->allowed_nodes, data_set); + pe__show_node_weights(true, clone, "After", clone->allowed_nodes, + clone->cluster); - /* write them back and sort */ + // Reset sort indexes to final node weights + g_list_foreach(clone->children, set_sort_index_to_node_weight, clone); - gIter = rsc->children; - for (; gIter != NULL; gIter = gIter->next) { - pe_resource_t *child = (pe_resource_t *) gIter->data; - - chosen = child->fns->location(child, NULL, FALSE); - if (!pcmk_is_set(child->flags, pe_rsc_managed) - && (child->next_role == RSC_ROLE_PROMOTED)) { - child->sort_index = INFINITY; + // Finally, sort instances in descending order of promotion priority + clone->children = g_list_sort(clone->children, cmp_promotable_instance); + pe__clear_resource_flags(clone, pe_rsc_merging); +} - } else if (chosen == NULL || child->sort_index < 0) { - pe_rsc_trace(rsc, "%s: %d", child->id, child->sort_index); +/*! + * \internal + * \brief Find the active instance (if any) of an anonymous clone on a node + * + * \param[in] clone Anonymous clone to check + * \param[in] id Instance ID (without instance number) to check + * \param[in] node Node to check + * + * \return + */ +static pe_resource_t * +find_active_anon_instance(pe_resource_t *clone, const char *id, + const pe_node_t *node) +{ + for (GList *iter = clone->children; iter; iter = iter->next) { + pe_resource_t *child = iter->data; + pe_resource_t *active = NULL; + + // Use ->find_rsc() in case this is a cloned group + active = clone->fns->find_rsc(child, id, node, + pe_find_clone|pe_find_current); + if (active != NULL) { + return active; + } + } + return NULL; +} - } else { - node = (pe_node_t *) pe_hash_table_lookup(rsc->allowed_nodes, chosen->details->id); - CRM_ASSERT(node != NULL); +/* + * \brief Check whether an anonymous clone instance is known on a node + * + * \param[in] clone Anonymous clone to check + * \param[in] id Instance ID (without instance number) to check + * \param[in] node Node to check + * + * \return true if \p id instance of \p clone is known on \p node, + * otherwise false + */ +static bool +anonymous_known_on(const pe_resource_t *clone, const char *id, + const pe_node_t *node) +{ + for (GList *iter = clone->children; iter; iter = iter->next) { + pe_resource_t *child = iter->data; - child->sort_index = node->weight; + /* Use ->find_rsc() because this might be a cloned group, and knowing + * that other members of the group are known here implies nothing. + */ + child = clone->fns->find_rsc(child, id, NULL, pe_find_clone); + CRM_LOG_ASSERT(child != NULL); + if (child != NULL) { + if (g_hash_table_lookup(child->known_on, node->details->id)) { + return true; + } } - pe_rsc_trace(rsc, "Set sort index: %s = %d", child->id, child->sort_index); } + return false; +} + +/*! + * \internal + * \brief Check whether a node is allowed to run a resource + * + * \param[in] rsc Resource to check + * \param[in] node Node to check + * + * \return true if \p node is allowed to run \p rsc, otherwise false + */ +static bool +is_allowed(const pe_resource_t *rsc, const pe_node_t *node) +{ + pe_node_t *allowed = pe_hash_table_lookup(rsc->allowed_nodes, + node->details->id); - rsc->children = g_list_sort(rsc->children, cmp_promotable_instance); - pe__clear_resource_flags(rsc, pe_rsc_merging); + return (allowed != NULL) && (allowed->weight >= 0); } -static gboolean -filter_anonymous_instance(pe_resource_t *rsc, const pe_node_t *node) +/*! + * \brief Check whether a clone instance's promotion score should be considered + * + * \param[in] rsc Promotable clone instance to check + * \param[in] node Node where score would be applied + * + * \return true if \p rsc's promotion score should be considered on \p node, + * otherwise false + */ +static bool +promotion_score_applies(pe_resource_t *rsc, const pe_node_t *node) { - GList *rIter = NULL; - char *key = clone_strip(rsc->id); + char *id = clone_strip(rsc->id); pe_resource_t *parent = uber_parent(rsc); + pe_resource_t *active = NULL; + const char *reason = "allowed"; - for (rIter = parent->children; rIter; rIter = rIter->next) { - /* If there is an active instance on the node, only it receives the - * promotion score. Use ->find_rsc() in case this is a cloned group. + // Some checks apply only to anonymous clone instances + if (!pcmk_is_set(rsc->flags, pe_rsc_unique)) { + + // If instance is active on the node, its score definitely applies + active = find_active_anon_instance(parent, id, node); + if (active == rsc) { + reason = "active"; + goto check_allowed; + } + + /* If *no* instance is active on this node, this instance's score will + * count if it has been probed on this node. */ - pe_resource_t *child = rIter->data; - pe_resource_t *active = parent->fns->find_rsc(child, key, node, pe_find_clone|pe_find_current); - - if(rsc == active) { - pe_rsc_trace(rsc, "Found %s for %s active on %s: done", active->id, key, node->details->uname); - free(key); - return TRUE; - } else if(active) { - pe_rsc_trace(rsc, "Found %s for %s on %s: not %s", active->id, key, node->details->uname, rsc->id); - free(key); - return FALSE; - } else { - pe_rsc_trace(rsc, "%s on %s: not active", key, node->details->uname); + if ((active == NULL) && anonymous_known_on(parent, id, node)) { + reason = "probed"; + goto check_allowed; } } - for (rIter = parent->children; rIter; rIter = rIter->next) { - pe_resource_t *child = rIter->data; + /* If this clone's status is unknown on *all* nodes (e.g. cluster startup), + * take all instances' scores into account, to make sure we use any + * permanent promotion scores. + */ + if ((rsc->running_on == NULL) && (g_hash_table_size(rsc->known_on) == 0)) { + reason = "none probed"; + goto check_allowed; + } - /* - * We know it's not running, but any score will still count if - * the instance has been probed on $node - * - * Again use ->find_rsc() because we might be a cloned group - * and knowing that other members of the group are known here - * implies nothing - */ - rsc = parent->fns->find_rsc(child, key, NULL, pe_find_clone); - CRM_LOG_ASSERT(rsc); - if(rsc) { - pe_rsc_trace(rsc, "Checking %s for %s on %s", rsc->id, key, node->details->uname); - if (g_hash_table_lookup(rsc->known_on, node->details->id)) { - free(key); - return TRUE; - } - } + /* Otherwise, we've probed and/or started the resource *somewhere*, so + * consider promotion scores on nodes where we know the status. + */ + if ((pe_hash_table_lookup(rsc->known_on, node->details->id) != NULL) + || (pe_find_node_id(rsc->running_on, node->details->id) != NULL)) { + reason = "known"; + } else { + pe_rsc_trace(rsc, + "Ignoring %s promotion score (for %s) on %s: not probed", + rsc->id, id, node->details->uname); + free(id); + return false; + } + +check_allowed: + if (is_allowed(rsc, node)) { + pe_rsc_trace(rsc, "Counting %s promotion score (for %s) on %s: %s", + rsc->id, id, node->details->uname, reason); + free(id); + return true; } - free(key); - return FALSE; + + pe_rsc_trace(rsc, "Ignoring %s promotion score (for %s) on %s: not allowed", + rsc->id, id, node->details->uname); + free(id); + return false; } +/*! + * \internal + * \brief Get the value of a promotion score node attribute + * + * \param[in] rsc Promotable clone instance to get promotion score for + * \param[in] node Node to get promotion score for + * \param[in] name Resource name to use in promotion score attribute name + * + * \return Value of promotion score node attribute for \p rsc on \p node + */ static const char * -lookup_promotion_score(pe_resource_t *rsc, const pe_node_t *node, const char *name) +promotion_attr_value(pe_resource_t *rsc, const pe_node_t *node, + const char *name) { + char *attr_name = NULL; const char *attr_value = NULL; - if (node && name) { - char *attr_name = pcmk_promotion_score_name(name); + CRM_CHECK((rsc != NULL) && (node != NULL) && (name != NULL), return NULL); - attr_value = pe_node_attribute_calculated(node, attr_name, rsc); - free(attr_name); - } + attr_name = pcmk_promotion_score_name(name); + attr_value = pe_node_attribute_calculated(node, attr_name, rsc); + free(attr_name); return attr_value; } +/*! + * \internal + * \brief Get the promotion score for a clone instance on a node + * + * \param[in] rsc Promotable clone instance to get score for + * \param[in] node Node to get score for + * \param[out] is_default If non-NULL, will be set true if no score available + * + * \return Promotion score for \p rsc on \p node (or 0 if none) + */ static int -promotion_score(pe_resource_t *rsc, const pe_node_t *node, int not_set_value) +promotion_score(pe_resource_t *rsc, const pe_node_t *node, bool *is_default) { - char *name = rsc->id; + char *name = NULL; const char *attr_value = NULL; - int score = not_set_value; - pe_node_t *match = NULL; - - CRM_CHECK(node != NULL, return not_set_value); - - if (rsc->children) { - GList *gIter = rsc->children; - for (; gIter != NULL; gIter = gIter->next) { - pe_resource_t *child = (pe_resource_t *) gIter->data; - int c_score = promotion_score(child, node, not_set_value); - - if (score == not_set_value) { - score = c_score; - } else { - score += c_score; - } - } - return score; + if (is_default != NULL) { + *is_default = true; } - if (!pcmk_is_set(rsc->flags, pe_rsc_unique) - && filter_anonymous_instance(rsc, node)) { + CRM_CHECK((rsc != NULL) && (node != NULL), return 0); - pe_rsc_trace(rsc, "Anonymous clone %s is allowed on %s", rsc->id, node->details->uname); + /* If this is an instance of a cloned group, the promotion score is the sum + * of all members' promotion scores. + */ + if (rsc->children != NULL) { + int score = 0; - } else if (rsc->running_on || g_hash_table_size(rsc->known_on)) { - /* If we've probed and/or started the resource anywhere, consider - * promotion scores only from nodes where we know the status. However, - * if the status of all nodes is unknown (e.g. cluster startup), - * skip this code, to make sure we take into account any permanent - * promotion scores set previously. - */ - pe_node_t *known = pe_hash_table_lookup(rsc->known_on, node->details->id); + for (GList *iter = rsc->children; iter != NULL; iter = iter->next) { + pe_resource_t *child = (pe_resource_t *) iter->data; + bool child_default = false; + int child_score = promotion_score(child, node, &child_default); - match = pe_find_node_id(rsc->running_on, node->details->id); - if ((match == NULL) && (known == NULL)) { - pe_rsc_trace(rsc, "skipping %s (aka. %s) promotion score on %s because inactive", - rsc->id, rsc->clone_name, node->details->uname); - return score; + if (!child_default && (is_default != NULL)) { + *is_default = false; + } + score += child_score; } - } - - match = pe_hash_table_lookup(rsc->allowed_nodes, node->details->id); - if (match == NULL) { - return score; - - } else if (match->weight < 0) { - pe_rsc_trace(rsc, "%s on %s has score: %d - ignoring", - rsc->id, match->details->uname, match->weight); return score; } - if (rsc->clone_name) { - /* Use the name the lrm knows this resource as, - * since that's what crm_attribute --promotion would have used - */ - name = rsc->clone_name; + if (!promotion_score_applies(rsc, node)) { + return 0; } - attr_value = lookup_promotion_score(rsc, node, name); - pe_rsc_trace(rsc, "Promotion score for %s on %s = %s", - name, node->details->uname, pcmk__s(attr_value, "(unset)")); + /* For the promotion score attribute name, use the name the resource is + * known as in resource history, since that's what crm_attribute --promotion + * would have used. + */ + name = (rsc->clone_name == NULL)? rsc->id : rsc->clone_name; - if ((attr_value == NULL) && !pcmk_is_set(rsc->flags, pe_rsc_unique)) { - /* If we don't have any LRM history yet, we won't have clone_name -- in - * that case, for anonymous clones, try the resource name without any - * instance number. + attr_value = promotion_attr_value(rsc, node, name); + if (attr_value != NULL) { + pe_rsc_trace(rsc, "Promotion score for %s on %s = %s", + name, node->details->uname, pcmk__s(attr_value, "(unset)")); + } else if (!pcmk_is_set(rsc->flags, pe_rsc_unique)) { + /* If we don't have any resource history yet, we won't have clone_name. + * In that case, for anonymous clones, try the resource name without + * any instance number. */ name = clone_strip(rsc->id); - if (strcmp(rsc->id, name)) { - attr_value = lookup_promotion_score(rsc, node, name); - pe_rsc_trace(rsc, "Stripped promotion score for %s on %s = %s", - name, node->details->uname, + if (strcmp(rsc->id, name) != 0) { + attr_value = promotion_attr_value(rsc, node, name); + pe_rsc_trace(rsc, "Promotion score for %s on %s (for %s) = %s", + name, node->details->uname, rsc->id, pcmk__s(attr_value, "(unset)")); } free(name); } - if (attr_value != NULL) { - score = char2score(attr_value); + if (attr_value == NULL) { + return 0; } - return score; + if (is_default != NULL) { + *is_default = false; + } + return char2score(attr_value); } void pcmk__add_promotion_scores(pe_resource_t *rsc) { int score, new_score; GList *gIter = rsc->children; if (pe__set_clone_flag(rsc, pe__clone_promotion_added) == pcmk_rc_already) { return; } for (; gIter != NULL; gIter = gIter->next) { GHashTableIter iter; pe_node_t *node = NULL; pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; g_hash_table_iter_init(&iter, child_rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { if (!pcmk__node_available(node, false, false)) { /* This node will never be promoted, so don't apply the * promotion score, as that may lead to clone shuffling. */ continue; } - score = promotion_score(child_rsc, node, 0); + score = promotion_score(child_rsc, node, NULL); if (score > 0) { new_score = pcmk__add_scores(node->weight, score); if (new_score != node->weight) { pe_rsc_trace(rsc, "\t%s: Updating preference for %s (%d->%d)", child_rsc->id, node->details->uname, node->weight, new_score); node->weight = new_score; } } new_score = QB_MAX(child_rsc->priority, score); if (new_score != child_rsc->priority) { pe_rsc_trace(rsc, "\t%s: Updating priority (%d->%d)", child_rsc->id, child_rsc->priority, new_score); child_rsc->priority = new_score; } } } } static void set_role_unpromoted(pe_resource_t *rsc, bool current) { GList *gIter = rsc->children; if (current) { if (rsc->role == RSC_ROLE_STARTED) { rsc->role = RSC_ROLE_UNPROMOTED; } } else { GList *allocated = NULL; rsc->fns->location(rsc, &allocated, FALSE); pe__set_next_role(rsc, (allocated? RSC_ROLE_UNPROMOTED : RSC_ROLE_STOPPED), "unpromoted instance"); g_list_free(allocated); } for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; set_role_unpromoted(child_rsc, current); } } static void set_role_promoted(pe_resource_t *rsc, gpointer user_data) { if (rsc->next_role == RSC_ROLE_UNKNOWN) { pe__set_next_role(rsc, RSC_ROLE_PROMOTED, "promoted instance"); } g_list_foreach(rsc->children, (GFunc) set_role_promoted, NULL); } pe_node_t * pcmk__set_instance_roles(pe_resource_t *rsc, pe_working_set_t *data_set) { int promoted = 0; GList *gIter = NULL; GList *gIter2 = NULL; GHashTableIter iter; pe_node_t *node = NULL; pe_node_t *chosen = NULL; enum rsc_role_e next_role = RSC_ROLE_UNKNOWN; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); // Repurpose count to track the number of promoted instances allocated g_hash_table_iter_init(&iter, rsc->allowed_nodes); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { node->count = 0; } /* * assign priority */ for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { GList *list = NULL; pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; pe_rsc_trace(rsc, "Assigning priority for %s: %s", child_rsc->id, role2text(child_rsc->next_role)); if (child_rsc->fns->state(child_rsc, TRUE) == RSC_ROLE_STARTED) { set_role_unpromoted(child_rsc, true); } chosen = child_rsc->fns->location(child_rsc, &list, FALSE); if (pcmk__list_of_multiple(list)) { pcmk__config_err("Cannot promote non-colocated child %s", child_rsc->id); } g_list_free(list); if (chosen == NULL) { continue; } next_role = child_rsc->fns->state(child_rsc, FALSE); switch (next_role) { case RSC_ROLE_STARTED: case RSC_ROLE_UNKNOWN: - /* - * Default to -1 if no value is set - * - * This allows instances eligible for promotion to be specified - * based solely on rsc_location constraints, - * but prevents anyone from being promoted if - * neither a constraint nor a promotion score is present - */ - child_rsc->priority = promotion_score(child_rsc, chosen, -1); + { + bool is_default = false; + + child_rsc->priority = promotion_score(child_rsc, chosen, + &is_default); + if (is_default) { + /* + * Default to -1 if no value is set. This allows + * instances eligible for promotion to be specified + * based solely on rsc_location constraints, but + * prevents any instance from being promoted if neither + * a constraint nor a promotion score is present + */ + child_rsc->priority = -1; + } + } break; case RSC_ROLE_UNPROMOTED: case RSC_ROLE_STOPPED: child_rsc->priority = -INFINITY; break; case RSC_ROLE_PROMOTED: /* We will arrive here if we're re-creating actions after a stonith */ break; default: CRM_CHECK(FALSE /* unhandled */ , crm_err("Unknown resource role: %d for %s", next_role, child_rsc->id)); } apply_promoted_locations(child_rsc, child_rsc->rsc_location, chosen); apply_promoted_locations(child_rsc, rsc->rsc_location, chosen); for (gIter2 = child_rsc->rsc_cons; gIter2 != NULL; gIter2 = gIter2->next) { pcmk__colocation_t *cons = (pcmk__colocation_t *) gIter2->data; child_rsc->cmds->rsc_colocation_lh(child_rsc, cons->primary, cons, data_set); } child_rsc->sort_index = child_rsc->priority; pe_rsc_trace(rsc, "Assigning priority for %s: %d", child_rsc->id, child_rsc->priority); if (next_role == RSC_ROLE_PROMOTED) { child_rsc->sort_index = INFINITY; } } - pe__show_node_weights(true, rsc, "Pre merge", rsc->allowed_nodes, data_set); - promotion_order(rsc, data_set); + sort_promotable_instances(rsc); // Choose the first N eligible instances to be promoted for (gIter = rsc->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; chosen = child_rsc->fns->location(child_rsc, NULL, FALSE); if (pcmk_is_set(data_set->flags, pe_flag_show_scores) && !pcmk__is_daemon) { if (data_set->priv != NULL) { pcmk__output_t *out = data_set->priv; out->message(out, "promotion-score", child_rsc, chosen, pcmk_readable_score(child_rsc->sort_index)); } } else { pe_rsc_trace(rsc, "%s promotion score on %s: %s", child_rsc->id, (chosen? chosen->details->uname : "none"), pcmk_readable_score(child_rsc->sort_index)); } chosen = NULL; /* nuke 'chosen' so that we don't promote more than the * required number of instances */ if (child_rsc->sort_index < 0) { pe_rsc_trace(rsc, "Not supposed to promote child: %s", child_rsc->id); } else if ((promoted < clone_data->promoted_max) || !pcmk_is_set(rsc->flags, pe_rsc_managed)) { chosen = node_to_be_promoted_on(child_rsc); } pe_rsc_debug(rsc, "%s promotion score: %d", child_rsc->id, child_rsc->priority); if (chosen == NULL) { set_role_unpromoted(child_rsc, false); continue; } else if ((child_rsc->role < RSC_ROLE_PROMOTED) && !pcmk_is_set(data_set->flags, pe_flag_have_quorum) && data_set->no_quorum_policy == no_quorum_freeze) { crm_notice("Resource %s cannot be elevated from %s to %s: no-quorum-policy=freeze", child_rsc->id, role2text(child_rsc->role), role2text(child_rsc->next_role)); set_role_unpromoted(child_rsc, false); continue; } chosen->count++; pe_rsc_info(rsc, "Promoting %s (%s %s)", child_rsc->id, role2text(child_rsc->role), chosen->details->uname); set_role_promoted(child_rsc, NULL); promoted++; } pe_rsc_info(rsc, "%s: Promoted %d instances of a possible %d", rsc->id, promoted, clone_data->promoted_max); return NULL; } void create_promotable_actions(pe_resource_t * rsc, pe_working_set_t * data_set) { pe_action_t *action = NULL; GList *gIter = rsc->children; pe_action_t *action_complete = NULL; bool any_promoting = false; bool any_demoting = false; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); pe_rsc_debug(rsc, "Creating actions for %s", rsc->id); for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; pe_rsc_trace(rsc, "Creating actions for %s", child_rsc->id); child_rsc->cmds->create_actions(child_rsc, data_set); check_for_role_change(child_rsc, &any_demoting, &any_promoting); } /* promote */ action = pcmk__new_rsc_pseudo_action(rsc, RSC_PROMOTE, !any_promoting, true); action_complete = pcmk__new_rsc_pseudo_action(rsc, RSC_PROMOTED, !any_promoting, true); action_complete->priority = INFINITY; if (clone_data->promote_notify == NULL) { clone_data->promote_notify = pcmk__clone_notif_pseudo_ops(rsc, RSC_PROMOTE, action, action_complete); } /* demote */ action = pcmk__new_rsc_pseudo_action(rsc, RSC_DEMOTE, !any_demoting, true); action_complete = pcmk__new_rsc_pseudo_action(rsc, RSC_DEMOTED, !any_demoting, true); action_complete->priority = INFINITY; if (clone_data->demote_notify == NULL) { clone_data->demote_notify = pcmk__clone_notif_pseudo_ops(rsc, RSC_DEMOTE, action, action_complete); if (clone_data->promote_notify) { /* If we ever wanted groups to have notifications we'd need to move this to native_internal_constraints() one day * Requires exposing *_notify */ order_actions(clone_data->stop_notify->post_done, clone_data->promote_notify->pre, pe_order_optional); order_actions(clone_data->start_notify->post_done, clone_data->promote_notify->pre, pe_order_optional); order_actions(clone_data->demote_notify->post_done, clone_data->promote_notify->pre, pe_order_optional); order_actions(clone_data->demote_notify->post_done, clone_data->start_notify->pre, pe_order_optional); order_actions(clone_data->demote_notify->post_done, clone_data->stop_notify->pre, pe_order_optional); } } /* restore the correct priority */ gIter = rsc->children; for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; child_rsc->priority = rsc->priority; } } void promote_demote_constraints(pe_resource_t *rsc, pe_working_set_t *data_set) { /* global stopped before start */ pcmk__order_resource_actions(rsc, RSC_STOPPED, rsc, RSC_START, pe_order_optional, data_set); /* global stopped before promote */ pcmk__order_resource_actions(rsc, RSC_STOPPED, rsc, RSC_PROMOTE, pe_order_optional, data_set); /* global demoted before start */ pcmk__order_resource_actions(rsc, RSC_DEMOTED, rsc, RSC_START, pe_order_optional, data_set); /* global started before promote */ pcmk__order_resource_actions(rsc, RSC_STARTED, rsc, RSC_PROMOTE, pe_order_optional, data_set); /* global demoted before stop */ pcmk__order_resource_actions(rsc, RSC_DEMOTED, rsc, RSC_STOP, pe_order_optional, data_set); /* global demote before demoted */ pcmk__order_resource_actions(rsc, RSC_DEMOTE, rsc, RSC_DEMOTED, pe_order_optional, data_set); /* global demoted before promote */ pcmk__order_resource_actions(rsc, RSC_DEMOTED, rsc, RSC_PROMOTE, pe_order_optional, data_set); } void promotable_constraints(pe_resource_t * rsc, pe_working_set_t * data_set) { GList *gIter = rsc->children; pe_resource_t *last_rsc = NULL; promote_demote_constraints(rsc, data_set); for (; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; /* child demote before promote */ pcmk__order_resource_actions(child_rsc, RSC_DEMOTE, child_rsc, RSC_PROMOTE, pe_order_optional, data_set); order_instance_promotion(rsc, child_rsc, last_rsc); order_instance_demotion(rsc, child_rsc, last_rsc); last_rsc = child_rsc; } } static void node_hash_update_one(GHashTable * hash, pe_node_t * other, const char *attr, int score) { GHashTableIter iter; pe_node_t *node = NULL; const char *value = NULL; if (other == NULL) { return; } else if (attr == NULL) { attr = CRM_ATTR_UNAME; } value = pe_node_attribute_raw(other, attr); g_hash_table_iter_init(&iter, hash); while (g_hash_table_iter_next(&iter, NULL, (void **)&node)) { const char *tmp = pe_node_attribute_raw(node, attr); if (pcmk__str_eq(value, tmp, pcmk__str_casei)) { crm_trace("%s: %d + %d", node->details->uname, node->weight, other->weight); node->weight = pcmk__add_scores(node->weight, score); } } } void promotable_colocation_rh(pe_resource_t *dependent, pe_resource_t *primary, pcmk__colocation_t *constraint, pe_working_set_t *data_set) { GList *gIter = NULL; if (pcmk_is_set(dependent->flags, pe_rsc_provisional)) { GList *affected_nodes = NULL; for (gIter = primary->children; gIter != NULL; gIter = gIter->next) { pe_resource_t *child_rsc = (pe_resource_t *) gIter->data; pe_node_t *chosen = child_rsc->fns->location(child_rsc, NULL, FALSE); enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, FALSE); pe_rsc_trace(primary, "Processing: %s", child_rsc->id); if ((chosen != NULL) && (next_role == constraint->primary_role)) { pe_rsc_trace(primary, "Applying: %s %s %s %d", child_rsc->id, role2text(next_role), chosen->details->uname, constraint->score); if (constraint->score < INFINITY) { node_hash_update_one(dependent->allowed_nodes, chosen, constraint->node_attribute, constraint->score); } affected_nodes = g_list_prepend(affected_nodes, chosen); } } /* Only do this if it's not a promoted-with-promoted colocation. Doing * this unconditionally would prevent unpromoted instances from being * started. */ if ((constraint->dependent_role != RSC_ROLE_PROMOTED) || (constraint->primary_role != RSC_ROLE_PROMOTED)) { if (constraint->score >= INFINITY) { node_list_exclude(dependent->allowed_nodes, affected_nodes, TRUE); } } g_list_free(affected_nodes); } else if (constraint->dependent_role == RSC_ROLE_PROMOTED) { pe_resource_t *primary_instance; primary_instance = find_compatible_child(dependent, primary, constraint->primary_role, FALSE, data_set); if ((primary_instance == NULL) && (constraint->score >= INFINITY)) { pe_rsc_trace(dependent, "%s can't be promoted %s", dependent->id, constraint->id); dependent->priority = -INFINITY; } else if (primary_instance != NULL) { int new_priority = pcmk__add_scores(dependent->priority, constraint->score); pe_rsc_debug(dependent, "Applying %s to %s", constraint->id, dependent->id); pe_rsc_debug(dependent, "\t%s: %d->%d", dependent->id, dependent->priority, new_priority); dependent->priority = new_priority; } } return; }