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 909116 Details for
Bug 1108778
'pcs resource unclone group-clone' removes all the group resources but the first one
[?]
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
0001-Fixed-pcs-resource-unclone-group-clone.patch (text/plain), 12.01 KB, created by
Tomas Jelinek
on 2014-06-16 12:31:45 UTC
(
hide
)
Description:
proposed fix
Filename:
MIME Type:
Creator:
Tomas Jelinek
Created:
2014-06-16 12:31:45 UTC
Size:
12.01 KB
patch
obsolete
>From 49e3ad1bc319cb2e585161b6ca7a4257b6f06ccf Mon Sep 17 00:00:00 2001 >From: Tomas Jelinek <tojeline@redhat.com> >Date: Fri, 13 Jun 2014 15:26:03 +0200 >Subject: [PATCH] Fixed 'pcs resource unclone group-clone' > >--- > pcs/resource.py | 16 +++---- > pcs/test/Makefile | 1 + > pcs/test/test_resource.py | 39 ++++++++++++++++ > pcs/test/test_utils.py | 110 ++++++++++++++++++++++++++++++++++++++++++++++ > pcs/utils.py | 31 +++++++++++++ > 5 files changed, 188 insertions(+), 9 deletions(-) > create mode 100644 pcs/test/test_utils.py > >diff --git a/pcs/resource.py b/pcs/resource.py >index c499e80..2223fcf 100644 >--- a/pcs/resource.py >+++ b/pcs/resource.py >@@ -1134,15 +1134,13 @@ def resource_clone_master_remove(argv): > break > > if not found: >- for cm in re.getElementsByTagName("clone") + re.getElementsByTagName("master"): >- if cm.getAttribute("id") == name: >- prim = cm.getElementsByTagName("primitive") >- if len(prim) != 0: >- prim = prim[0] >- constraint.remove_constraints_containing(name, passed_dom=dom) >- cm.parentNode.appendChild(prim) >- cm.parentNode.removeChild(cm) >- found = True >+ cloned = utils.dom_get_clone_ms_resource(re, name) >+ if cloned: >+ constraint.remove_constraints_containing(name, passed_dom=dom) >+ cm = cloned.parentNode >+ cm.parentNode.appendChild(cloned) >+ cm.parentNode.removeChild(cm) >+ found = True > > if not found: > utils.err("could not find resource or group: %s" % name) >diff --git a/pcs/test/Makefile b/pcs/test/Makefile >index 36e560a..c737e24 100644 >--- a/pcs/test/Makefile >+++ b/pcs/test/Makefile >@@ -8,6 +8,7 @@ ifneq ($(python_version_major_minor),2.6) > endif > > test: >+ python test_utils.py ${pyunit_flags} > python test_cluster.py ${pyunit_flags} > python test_resource.py ${pyunit_flags} > python test_constraints.py ${pyunit_flags} >diff --git a/pcs/test/test_resource.py b/pcs/test/test_resource.py >index 754fb8c..a0a28d4 100644 >--- a/pcs/test/test_resource.py >+++ b/pcs/test/test_resource.py >@@ -1704,6 +1704,45 @@ class ResourceTest(unittest.TestCase): > ac(o," Resource: X0 (class=ocf provider=heartbeat type=Dummy)\n Operations: start interval=0s timeout=20 (X0-start-timeout-20)\n stop interval=0s timeout=20 (X0-stop-timeout-20)\n monitor interval=10 timeout=20 (X0-monitor-interval-10)\n Resource: X1 (class=ocf provider=heartbeat type=Dummy)\n Operations: start interval=0s timeout=20 (X1-start-timeout-20)\n stop interval=0s timeout=20 (X1-stop-timeout-20)\n monitor interval=90s (X1-monitor-interval-90s)\n Resource: X2 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=1.1.1.1 \n Operations: start interval=0s timeout=20s (X2-start-timeout-20s)\n stop interval=0s timeout=20s (X2-stop-timeout-20s)\n monitor interval=10s timeout=20s (X2-monitor-interval-10s)\n Resource: X3 (class=ocf provider=heartbeat type=IPaddr2)\n Attributes: ip=1.1.1.1 \n Operations: monitor interval=1s (X3-monitor-interval-1s)\n start interval=0s timeout=1s (X3-start-timeout-1s)\n stop interval=0s timeout=1s (X3-stop-timeout-1s)\n") > assert r == 0 > >+ def testClonedMasteredGroup(self): >+ output, retVal = pcs(temp_cib, "resource create dummy1 Dummy --no-default-ops --group dummies") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource create dummy2 Dummy --no-default-ops --group dummies") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource create dummy3 Dummy --no-default-ops --group dummies") >+ ac(output, "") >+ assert retVal == 0 >+ >+ output, retVal = pcs(temp_cib, "resource clone dummies") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show dummies-clone") >+ ac(output, " Clone: dummies-clone\n Group: dummies\n Resource: dummy1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy1-monitor-interval-60s)\n Resource: dummy2 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy2-monitor-interval-60s)\n Resource: dummy3 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy3-monitor-interval-60s)\n") >+ assert retVal == 0 >+ >+ output, retVal = pcs(temp_cib, "resource unclone dummies-clone") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show") >+ ac(output, " Resource Group: dummies\n dummy1\t(ocf::heartbeat:Dummy):\tStopped \n dummy2\t(ocf::heartbeat:Dummy):\tStopped \n dummy3\t(ocf::heartbeat:Dummy):\tStopped \n") >+ assert retVal == 0 >+ >+ output, retVal = pcs(temp_cib, "resource master dummies") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show dummies-master") >+ ac(output, " Master: dummies-master\n Group: dummies\n Resource: dummy1 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy1-monitor-interval-60s)\n Resource: dummy2 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy2-monitor-interval-60s)\n Resource: dummy3 (class=ocf provider=heartbeat type=Dummy)\n Operations: monitor interval=60s (dummy3-monitor-interval-60s)\n") >+ assert retVal == 0 >+ >+ output, retVal = pcs(temp_cib, "resource unclone dummies-master") >+ ac(output, "") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show") >+ ac(output, " Resource Group: dummies\n dummy1\t(ocf::heartbeat:Dummy):\tStopped \n dummy2\t(ocf::heartbeat:Dummy):\tStopped \n dummy3\t(ocf::heartbeat:Dummy):\tStopped \n") >+ assert retVal == 0 >+ > > if __name__ == "__main__": > unittest.main() >diff --git a/pcs/test/test_utils.py b/pcs/test/test_utils.py >new file mode 100644 >index 0000000..de7389b >--- /dev/null >+++ b/pcs/test/test_utils.py >@@ -0,0 +1,110 @@ >+import os >+import sys >+import unittest >+import xml.dom.minidom >+parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) >+sys.path.insert(0, parentdir) >+import utils >+ >+class UtilsTest(unittest.TestCase): >+ def testDomGetResources(self): >+ def assert_element_id(node, node_id): >+ self.assertTrue( >+ isinstance(node, xml.dom.minidom.Element), >+ "element with id '%s' not found" % node_id >+ ) >+ self.assertEquals(node.getAttribute("id"), node_id) >+ >+ def test_dom_get(method, dom, ok_ids, bad_ids): >+ for element_id in ok_ids: >+ assert_element_id(method(dom, element_id), element_id) >+ for element_id in bad_ids: >+ self.assertFalse(method(dom, element_id)) >+ >+ cib_dom = xml.dom.minidom.parse("empty.xml") >+ self.assertFalse(utils.dom_get_clone(cib_dom, "myClone")) >+ self.assertFalse(utils.dom_get_master(cib_dom, "myMaster")) >+ self.assertFalse(utils.dom_get_clone_ms_resource(cib_dom, "myClone")) >+ self.assertFalse(utils.dom_get_clone_ms_resource(cib_dom, "myMaster")) >+ >+ new_resources = xml.dom.minidom.parseString(""" >+ <resources> >+ <primitive id="myResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ <clone id="myClone"> >+ <primitive id="myClonedResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ </clone> >+ <master id="myMaster"> >+ <primitive id="myMasteredResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ </master> >+ <group id="myGroup"> >+ <primitive id="myGroupedResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ </group> >+ <clone id="myGroupClone"> >+ <group id="myClonedGroup"> >+ <primitive id="myClonedGroupedResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ </group> >+ </clone> >+ <master id="myGroupMaster"> >+ <group id="myMasteredGroup"> >+ <primitive id="myMasteredGroupedResource" >+ class="ocf" provider="heartbeat" type="Dummy"> >+ </primitive> >+ </group> >+ </master> >+ </resources> >+ """).documentElement >+ resources = cib_dom.getElementsByTagName("resources")[0] >+ resources.parentNode.replaceChild(new_resources, resources) >+ >+ all_ids = set([ >+ "none", "myResource", >+ "myClone", "myClonedResource", >+ "myMaster", "myMasteredResource", >+ "myGroup", "myGroupedResource", >+ "myGroupClone", "myClonedGroup", "myClonedGroupedResource", >+ "myGroupMaster", "myMasteredGroup", "myMasteredGroupedResource", >+ ]) >+ >+ clone_ids = set(["myClone", "myGroupClone"]) >+ test_dom_get( >+ utils.dom_get_clone, cib_dom, >+ clone_ids, all_ids - clone_ids >+ ) >+ >+ master_ids = set(["myMaster", "myGroupMaster"]) >+ test_dom_get( >+ utils.dom_get_master, cib_dom, >+ master_ids, all_ids - master_ids >+ ) >+ >+ >+ assert_element_id( >+ utils.dom_get_clone_ms_resource(cib_dom, "myClone"), >+ "myClonedResource" >+ ) >+ assert_element_id( >+ utils.dom_get_clone_ms_resource(cib_dom, "myGroupClone"), >+ "myClonedGroup" >+ ) >+ assert_element_id( >+ utils.dom_get_clone_ms_resource(cib_dom, "myMaster"), >+ "myMasteredResource" >+ ) >+ assert_element_id( >+ utils.dom_get_clone_ms_resource(cib_dom, "myGroupMaster"), >+ "myMasteredGroup" >+ ) >+ >+ >+if __name__ == "__main__": >+ unittest.main() >diff --git a/pcs/utils.py b/pcs/utils.py >index 8a15111..ecf3ad4 100644 >--- a/pcs/utils.py >+++ b/pcs/utils.py >@@ -639,6 +639,7 @@ def get_group_children(group_id): > child_resources.append(child.getAttribute("id")) > return child_resources > >+# deprecated, use dom_get_clone_ms_resource > def get_clone_ms_resource(clone_id,master=False): > dom = get_cib_dom() > if master: >@@ -654,12 +655,42 @@ def get_clone_ms_resource(clone_id,master=False): > return child.getAttribute("id") > return "" > >+def dom_get_clone_ms_resource(dom, clone_ms_id): >+ clone_ms = ( >+ dom_get_clone(dom, clone_ms_id) >+ or >+ dom_get_master(dom, clone_ms_id) >+ ) >+ if clone_ms: >+ for child in clone_ms.childNodes: >+ if ( >+ child.nodeType == xml.dom.minidom.Node.ELEMENT_NODE >+ and >+ child.tagName in ["group", "primitive"] >+ ): >+ return child >+ return None >+ >+# deprecated, use dom_get_master > def is_master(ms_id): > return does_exist("//master[@id='"+ms_id+"']") > >+def dom_get_master(dom, master_id): >+ for master in dom.getElementsByTagName("master"): >+ if master.getAttribute("id") == master_id: >+ return master >+ return None >+ >+# deprecated, use dom_get_clone > def is_clone(clone_id): > return does_exist("//clone[@id='"+clone_id+"']") > >+def dom_get_clone(dom, clone_id): >+ for clone in dom.getElementsByTagName("clone"): >+ if clone.getAttribute("id") == clone_id: >+ return clone >+ return None >+ > def is_group(group_id): > return does_exist("//group[@id='"+group_id+"']") > >-- >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 1108778
:
908589
| 909116