Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 940747 Details for
Bug 1108319
cloned group resource ignores 'constraint avoids node'
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
proposed fix GUI - enable creating of constraints with cloned resources
0001-Fix-adding-constraints-for-clone-or-master-resources.patch (text/plain), 25.73 KB, created by
Tomas Jelinek
on 2014-09-24 11:34:48 UTC
(
hide
)
Description:
proposed fix GUI - enable creating of constraints with cloned resources
Filename:
MIME Type:
Creator:
Tomas Jelinek
Created:
2014-09-24 11:34:48 UTC
Size:
25.73 KB
patch
obsolete
>From 7b94ff6544e33cc13c2fccf3e967c0f826acf505 Mon Sep 17 00:00:00 2001 >From: Tomas Jelinek <tojeline@redhat.com> >Date: Tue, 23 Sep 2014 17:24:17 +0200 >Subject: [PATCH] Fix adding constraints for clone or master resources in GUI > >It is not allowed to create constraints referencing resource inside clone >or master/slave resource because these constraints are ignored by >pacemaker. This patch makes pcs and pcsd automatically correct >the resource id to clone or master/slave parent in order to properly >create correct constraint. >--- > pcs/constraint.py | 72 ++++++++----- > pcs/pcs.py | 2 +- > pcs/test/test_constraints.py | 242 +++++++++++++++++++++++++++++++++++++++++++ > pcs/test/test_utils.py | 64 ++++++++---- > pcs/utils.py | 25 +++-- > pcsd/pcs.rb | 12 ++- > 6 files changed, 355 insertions(+), 62 deletions(-) > >diff --git a/pcs/constraint.py b/pcs/constraint.py >index 8614d0b..43a34e2 100644 >--- a/pcs/constraint.py >+++ b/pcs/constraint.py >@@ -202,16 +202,20 @@ def colocation_add(argv): > resource2 = argv.pop(0) > > cib_dom = utils.get_cib_dom() >- resource_valid, resource_error = utils.validate_constraint_resource( >- cib_dom, resource1 >- ) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource(cib_dom, resource1) > if not resource_valid: >- utils.err(resource_error) >- resource_valid, resource_error = utils.validate_constraint_resource( >- cib_dom, resource2 >- ) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ resource1 = correct_id >+ else: >+ utils.err(resource_error) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource(cib_dom, resource2) > if not resource_valid: >- utils.err(resource_error) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ resource2 = correct_id >+ else: >+ utils.err(resource_error) > > score,nv_pairs = parse_score_options(argv) > >@@ -413,11 +417,13 @@ def set_add_resource_sets(elem, sets, cib): > ) > res_set.setAttribute(key, val) > else: >- res_valid, res_error = utils.validate_constraint_resource( >- cib, opts >- ) >+ res_valid, res_error, correct_id \ >+ = utils.validate_constraint_resource(cib, opts) > if not res_valid: >- utils.err(res_error) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ opts = correct_id >+ else: >+ utils.err(res_error) > se = cib.createElement("resource_ref") > res_set.appendChild(se) > se.setAttribute("id", opts) >@@ -551,16 +557,20 @@ def order_add(argv,returnElementOnly=False): > resource2 = argv.pop(0) > > cib_dom = utils.get_cib_dom() >- resource_valid, resource_error = utils.validate_constraint_resource( >- cib_dom, resource1 >- ) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource(cib_dom, resource1) > if not resource_valid: >- utils.err(resource_error) >- resource_valid, resource_error = utils.validate_constraint_resource( >- cib_dom, resource2 >- ) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ resource1 = correct_id >+ else: >+ utils.err(resource_error) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource(cib_dom, resource2) > if not resource_valid: >- utils.err(resource_error) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ resource2 = correct_id >+ else: >+ utils.err(resource_error) > > sym = "true" if (len(argv) == 0 or argv[0] != "nonsymmetrical") else "false" > >@@ -834,11 +844,15 @@ def location_add(argv,rm=False): > resource_name = argv.pop(0) > node = argv.pop(0) > score = argv.pop(0) >- resource_valid, resource_error = utils.validate_constraint_resource( >- utils.get_cib_dom(), resource_name >- ) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource( >+ utils.get_cib_dom(), resource_name >+ ) > if not resource_valid: >- utils.err(resource_error) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ resource_name = correct_id >+ else: >+ utils.err(resource_error) > if not utils.is_score(score): > utils.err("invalid score '%s', use integer or INFINITY or -INFINITY" % score) > >@@ -876,11 +890,13 @@ def location_rule(argv): > sys.exit(1) > > res_name = argv.pop(0) >- resource_valid, resource_error = utils.validate_constraint_resource( >- utils.get_cib_dom(), res_name >- ) >+ resource_valid, resource_error, correct_id \ >+ = utils.validate_constraint_resource(utils.get_cib_dom(), res_name) > if not resource_valid: >- utils.err(resource_error) >+ if "--autocorrect" in utils.pcs_options and correct_id: >+ res_name = correct_id >+ else: >+ utils.err(resource_error) > > argv.pop(0) > >diff --git a/pcs/pcs.py b/pcs/pcs.py >index d708372..86b26f5 100755 >--- a/pcs/pcs.py >+++ b/pcs/pcs.py >@@ -54,7 +54,7 @@ def main(argv): > pcs_short_options_with_args.append(prev_char) > prev_char = c > >- pcs_long_options = ["local","start","all","clone","master","force","corosync_conf=", "defaults","debug","version","help","fullhelp","off","from=","to=", "name=", "wait", "group=","groups","full","enable","node=","nodesc","transport=", "addr0=","addr1=","bcast0=","bcast1=","mcast0=","mcast1=","mcastport0=","mcastport1=","ttl0=","ttl1=","rrpmode=", "broadcast0", "broadcast1","wait_for_all=","auto_tie_breaker=","last_man_standing=", "last_man_standing_window=","no-default-ops","ipv6","token=", "token_coefficient=", "consensus=", "miss_count_const=", "fail_recv_const=","join=", "disabled", "after=", "before="] >+ pcs_long_options = ["local","start","all","clone","master","force","corosync_conf=", "defaults","debug","version","help","fullhelp","off","from=","to=", "name=", "wait", "group=","groups","full","enable","node=","nodesc","transport=", "addr0=","addr1=","bcast0=","bcast1=","mcast0=","mcast1=","mcastport0=","mcastport1=","ttl0=","ttl1=","rrpmode=", "broadcast0", "broadcast1","wait_for_all=","auto_tie_breaker=","last_man_standing=", "last_man_standing_window=","no-default-ops","ipv6","token=", "token_coefficient=", "consensus=", "miss_count_const=", "fail_recv_const=","join=", "disabled", "after=", "before=", "autocorrect"] > # pull out negative number arguments and add them back after getopt > prev_arg = "" > for arg in argv: >diff --git a/pcs/test/test_constraints.py b/pcs/test/test_constraints.py >index eafa218..2f8e482 100644 >--- a/pcs/test/test_constraints.py >+++ b/pcs/test/test_constraints.py >@@ -855,6 +855,127 @@ Colocation Constraints: > """) > assert r == 0 > >+ def testMasterSlaveConstraintAutocorrect(self): >+ output, returnVal = pcs("resource create dummy1 dummy") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource create stateful1 stateful --master") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource create stateful2 stateful --group statefulG") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource master statefulG") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location stateful1 prefers rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location statefulG prefers rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location stateful1 rule #uname eq rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location statefulG rule #uname eq rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order stateful1 then dummy1 --autocorrect" >+ ) >+ ac(output, """\ >+Adding stateful1-master dummy1 (kind: Mandatory) (Options: first-action=start then-action=start) >+""") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order dummy1 then statefulG --autocorrect" >+ ) >+ ac(output, """\ >+Adding dummy1 statefulG-master (kind: Mandatory) (Options: first-action=start then-action=start) >+""") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order set stateful1 dummy1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order set dummy1 statefulG --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation add stateful1 with dummy1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation add dummy1 with statefulG --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation set dummy1 stateful1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation set statefulG dummy1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("constraint --full") >+ ac(output, """\ >+Location Constraints: >+ Resource: stateful1-master >+ Enabled on: rh7-1 (score:INFINITY) (id:location-stateful1-rh7-1-INFINITY) >+ Constraint: location-stateful1-master >+ Rule: score=INFINITY (id:location-stateful1-master-rule) >+ Expression: #uname eq rh7-1 (id:location-stateful1-master-rule-expr) >+ Resource: statefulG-master >+ Enabled on: rh7-1 (score:INFINITY) (id:location-statefulG-rh7-1-INFINITY) >+ Constraint: location-statefulG-master >+ Rule: score=INFINITY (id:location-statefulG-master-rule) >+ Expression: #uname eq rh7-1 (id:location-statefulG-master-rule-expr) >+Ordering Constraints: >+ start stateful1-master then start dummy1 (kind:Mandatory) (id:order-stateful1-master-dummy1-mandatory) >+ start dummy1 then start statefulG-master (kind:Mandatory) (id:order-dummy1-statefulG-master-mandatory) >+ Resource Sets: >+ set stateful1-master dummy1 (id:pcs_rsc_set_stateful1-master_dummy1) (id:pcs_rsc_order_stateful1_dummy1) >+ set dummy1 statefulG-master (id:pcs_rsc_set_dummy1_statefulG-master) (id:pcs_rsc_order_dummy1_statefulG) >+Colocation Constraints: >+ stateful1-master with dummy1 (score:INFINITY) (id:colocation-stateful1-master-dummy1-INFINITY) >+ dummy1 with statefulG-master (score:INFINITY) (id:colocation-dummy1-statefulG-master-INFINITY) >+ Resource Sets: >+ set dummy1 stateful1-master (id:pcs_rsc_set_dummy1_stateful1-master) setoptions score=INFINITY (id:pcs_rsc_colocation_dummy1_stateful1) >+ set statefulG-master dummy1 (id:pcs_rsc_set_statefulG-master_dummy1) setoptions score=INFINITY (id:pcs_rsc_colocation_statefulG_dummy1) >+""") >+ self.assertEquals(0, returnVal) >+ > def testCloneConstraint(self): > os.system("CIB_file="+temp_cib+" cibadmin -R --scope nodes --xml-text '<nodes><node id=\"1\" uname=\"rh7-1\"/><node id=\"2\" uname=\"rh7-2\"/></nodes>'") > >@@ -970,6 +1091,127 @@ Colocation Constraints: > """) > assert r == 0 > >+ def testCloneConstraintAutocorrect(self): >+ output, returnVal = pcs("resource create dummy1 dummy") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource create dummy Dummy --clone") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource create dummy2 Dummy --group dummyG") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("resource clone dummyG") >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location dummy prefers rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location dummyG prefers rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location dummy rule #uname eq rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint location dummyG rule #uname eq rh7-1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order dummy then dummy1 --autocorrect" >+ ) >+ ac(output, """\ >+Adding dummy-clone dummy1 (kind: Mandatory) (Options: first-action=start then-action=start) >+""") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order dummy1 then dummyG --autocorrect" >+ ) >+ ac(output, """\ >+Adding dummy1 dummyG-clone (kind: Mandatory) (Options: first-action=start then-action=start) >+""") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order set dummy1 dummy --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint order set dummyG dummy1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation add dummy with dummy1 --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation add dummy1 with dummyG --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation set dummy1 dummy --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs( >+ "constraint colocation set dummy1 dummyG --autocorrect" >+ ) >+ ac(output, "") >+ self.assertEquals(0, returnVal) >+ >+ output, returnVal = pcs("constraint --full") >+ ac(output, """\ >+Location Constraints: >+ Resource: dummy-clone >+ Enabled on: rh7-1 (score:INFINITY) (id:location-dummy-rh7-1-INFINITY) >+ Constraint: location-dummy-clone >+ Rule: score=INFINITY (id:location-dummy-clone-rule) >+ Expression: #uname eq rh7-1 (id:location-dummy-clone-rule-expr) >+ Resource: dummyG-clone >+ Enabled on: rh7-1 (score:INFINITY) (id:location-dummyG-rh7-1-INFINITY) >+ Constraint: location-dummyG-clone >+ Rule: score=INFINITY (id:location-dummyG-clone-rule) >+ Expression: #uname eq rh7-1 (id:location-dummyG-clone-rule-expr) >+Ordering Constraints: >+ start dummy-clone then start dummy1 (kind:Mandatory) (id:order-dummy-clone-dummy1-mandatory) >+ start dummy1 then start dummyG-clone (kind:Mandatory) (id:order-dummy1-dummyG-clone-mandatory) >+ Resource Sets: >+ set dummy1 dummy-clone (id:pcs_rsc_set_dummy1_dummy-clone) (id:pcs_rsc_order_dummy1_dummy) >+ set dummyG-clone dummy1 (id:pcs_rsc_set_dummyG-clone_dummy1) (id:pcs_rsc_order_dummyG_dummy1) >+Colocation Constraints: >+ dummy-clone with dummy1 (score:INFINITY) (id:colocation-dummy-clone-dummy1-INFINITY) >+ dummy1 with dummyG-clone (score:INFINITY) (id:colocation-dummy1-dummyG-clone-INFINITY) >+ Resource Sets: >+ set dummy1 dummy-clone (id:pcs_rsc_set_dummy1_dummy-clone-1) setoptions score=INFINITY (id:pcs_rsc_colocation_dummy1_dummy) >+ set dummy1 dummyG-clone (id:pcs_rsc_set_dummy1_dummyG-clone) setoptions score=INFINITY (id:pcs_rsc_colocation_dummy1_dummyG) >+""") >+ self.assertEquals(0, returnVal) >+ > def testMissingRole(self): > os.system("CIB_file="+temp_cib+" cibadmin -R --scope nodes --xml-text '<nodes><node id=\"1\" uname=\"rh7-1\"/><node id=\"2\" uname=\"rh7-2\"/></nodes>'") > o,r = pcs("resource create stateful0 Stateful --master") >diff --git a/pcs/test/test_utils.py b/pcs/test/test_utils.py >index c60b3c8..4526c09 100644 >--- a/pcs/test/test_utils.py >+++ b/pcs/test/test_utils.py >@@ -305,36 +305,36 @@ class UtilsTest(unittest.TestCase): > def testValidateConstraintResource(self): > dom = self.get_cib_resources() > self.assertEquals( >- (True, ""), >+ (True, "", "myClone"), > utils.validate_constraint_resource(dom, "myClone") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupClone"), > utils.validate_constraint_resource(dom, "myGroupClone") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myMaster"), > utils.validate_constraint_resource(dom, "myMaster") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupMaster"), > utils.validate_constraint_resource(dom, "myGroupMaster") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myResource"), > utils.validate_constraint_resource(dom, "myResource") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroup"), > utils.validate_constraint_resource(dom, "myGroup") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupedResource"), > utils.validate_constraint_resource(dom, "myGroupedResource") > ) > > self.assertEquals( >- (False, "Resource 'myNonexistent' does not exist"), >+ (False, "Resource 'myNonexistent' does not exist", None), > utils.validate_constraint_resource(dom, "myNonexistent") > ) > >@@ -343,15 +343,27 @@ class UtilsTest(unittest.TestCase): > "%s when adding constraints. Use --force to override." > ) > self.assertEquals( >- (False, message % ("myClonedResource", "myClone")), >+ ( >+ False, >+ message % ("myClonedResource", "myClone"), >+ "myClone" >+ ), > utils.validate_constraint_resource(dom, "myClonedResource") > ) > self.assertEquals( >- (False, message % ("myClonedGroup", "myGroupClone")), >+ ( >+ False, >+ message % ("myClonedGroup", "myGroupClone"), >+ "myGroupClone" >+ ), > utils.validate_constraint_resource(dom, "myClonedGroup") > ) > self.assertEquals( >- (False, message % ("myClonedGroupedResource", "myGroupClone")), >+ ( >+ False, >+ message % ("myClonedGroupedResource", "myGroupClone"), >+ "myGroupClone" >+ ), > utils.validate_constraint_resource(dom, "myClonedGroupedResource") > ) > >@@ -360,41 +372,53 @@ class UtilsTest(unittest.TestCase): > "%s when adding constraints. Use --force to override." > ) > self.assertEquals( >- (False, message % ("myMasteredResource", "myMaster")), >+ ( >+ False, >+ message % ("myMasteredResource", "myMaster"), >+ "myMaster" >+ ), > utils.validate_constraint_resource(dom, "myMasteredResource") > ) > self.assertEquals( >- (False, message % ("myMasteredGroup", "myGroupMaster")), >+ ( >+ False, >+ message % ("myMasteredGroup", "myGroupMaster"), >+ "myGroupMaster" >+ ), > utils.validate_constraint_resource(dom, "myMasteredGroup") > ) > self.assertEquals( >- (False, message % ("myMasteredGroupedResource", "myGroupMaster")), >+ ( >+ False, >+ message % ("myMasteredGroupedResource", "myGroupMaster"), >+ "myGroupMaster" >+ ), > utils.validate_constraint_resource(dom, "myMasteredGroupedResource") > ) > > utils.pcs_options["--force"] = True > self.assertEquals( >- (True, ""), >+ (True, "", "myClone"), > utils.validate_constraint_resource(dom, "myClonedResource") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupClone"), > utils.validate_constraint_resource(dom, "myClonedGroup") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupClone"), > utils.validate_constraint_resource(dom, "myClonedGroupedResource") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myMaster"), > utils.validate_constraint_resource(dom, "myMasteredResource") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupMaster"), > utils.validate_constraint_resource(dom, "myMasteredGroup") > ) > self.assertEquals( >- (True, ""), >+ (True, "", "myGroupMaster"), > utils.validate_constraint_resource(dom, "myMasteredGroupedResource") > ) > >diff --git a/pcs/utils.py b/pcs/utils.py >index 77df44a..12b1754 100644 >--- a/pcs/utils.py >+++ b/pcs/utils.py >@@ -878,6 +878,7 @@ def get_resource_master_id(resource_id): > return p.parentNode.getAttribute("id") > return None > >+# returns tuple (is_valid, error_message, correct_resource_id_if_exists) > def validate_constraint_resource(dom, resource_id): > resource_el = ( > dom_get_clone(dom, resource_id) >@@ -886,7 +887,7 @@ def validate_constraint_resource(dom, resource_id): > ) > if resource_el: > # clone and master is always valid >- return True, "" >+ return True, "", resource_id > > resource_el = ( > dom_get_resource(dom, resource_id) >@@ -894,31 +895,37 @@ def validate_constraint_resource(dom, resource_id): > dom_get_group(dom, resource_id) > ) > if not resource_el: >- return False, "Resource '%s' does not exist" % resource_id >- >- if "--force" in pcs_options: >- return True, "" >+ return False, "Resource '%s' does not exist" % resource_id, None > > clone_el = dom_get_resource_clone_ms_parent(dom, resource_id) > if not clone_el: > # primitive and group is valid if not in clone nor master >- return True, "" >+ return True, "", resource_id >+ >+ if "--force" in pcs_options: >+ return ( >+ True, >+ "", >+ clone_el.getAttribute("id") if clone_el else resource_id >+ ) > > if clone_el.tagName == "clone": > return ( > False, > "%s is a clone resource, you should use the clone id: %s " > "when adding constraints. Use --force to override." >- % (resource_id, clone_el.getAttribute("id")) >+ % (resource_id, clone_el.getAttribute("id")), >+ clone_el.getAttribute("id") > ) > if clone_el.tagName == "master": > return ( > False, > "%s is a master/slave resource, you should use the master id: %s " > "when adding constraints. Use --force to override." >- % (resource_id, clone_el.getAttribute("id")) >+ % (resource_id, clone_el.getAttribute("id")), >+ clone_el.getAttribute("id") > ) >- return True, "" >+ return True, "", resource_id > > > def dom_get_resource_remote_node_name(dom_resource): >diff --git a/pcsd/pcs.rb b/pcsd/pcs.rb >index 64a1dbc..03f99ed 100644 >--- a/pcsd/pcs.rb >+++ b/pcsd/pcs.rb >@@ -65,12 +65,15 @@ def add_location_constraint(resource, node, score) > nodescore = node +"="+score > end > >- stdout, stderr, retval = run_cmd(PCS,"constraint","location",resource,"prefers",nodescore) >+ stdout, stderr, retval = run_cmd( >+ PCS, "constraint", "location", resource, "prefers", nodescore, >+ "--autocorrect" >+ ) > return retval, stderr.join(' ') > end > > def add_location_constraint_rule(resource, rule, score, force=false) >- cmd = [PCS, "constraint", "location", resource, "rule"] >+ cmd = [PCS, "constraint", "location", "--autocorrect", resource, "rule"] > cmd << "score=#{score}" if score != "" > cmd.concat(rule.shellsplit()) > cmd << '--force' if force >@@ -87,7 +90,7 @@ def add_order_constraint( > end > command = [ > PCS, "constraint", "order", actionA, resourceA, "then", actionB, resourceB, >- score, sym >+ score, sym, "--autocorrect" > ] > command << '--force' if force > $logger.info command >@@ -98,7 +101,7 @@ def add_order_constraint( > end > > def add_order_set_constraint(resource_set_list, force=false) >- command = [PCS, "constraint", "order"] >+ command = [PCS, "constraint", "order", "--autocorrect"] > resource_set_list.each { |resource_set| > command << "set" > command.concat(resource_set) >@@ -114,6 +117,7 @@ def add_colocation_constraint(resourceA, resourceB, score, force=false) > end > command = [ > PCS, "constraint", "colocation", "add", resourceA, resourceB, score, >+ "--autocorrect" > ] > command << '--force' if force > $logger.info command >-- >1.9.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1108319
:
907756
|
929192
| 940747