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 909604 Details for
Bug 1107612
'resource delete' behaviour confusing for clone of group with more than one resource
[?]
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 1/2
0001-Fixed-deleting-cloned-group-and-master-slave-group.patch (text/plain), 12.91 KB, created by
Tomas Jelinek
on 2014-06-17 14:10:13 UTC
(
hide
)
Description:
proposed fix 1/2
Filename:
MIME Type:
Creator:
Tomas Jelinek
Created:
2014-06-17 14:10:13 UTC
Size:
12.91 KB
patch
obsolete
>From d92863bf1a3b265c7b6854cf361963267719951e Mon Sep 17 00:00:00 2001 >From: Tomas Jelinek <tojeline@redhat.com> >Date: Mon, 16 Jun 2014 16:27:57 +0200 >Subject: [PATCH 1/2] Fixed deleting cloned group and master/slave group > >--- > pcs/resource.py | 11 ++--- > pcs/test/Makefile | 1 + > pcs/test/test_resource.py | 49 +++++++++++++++++++++ > pcs/test/test_utils.py | 110 ++++++++++++++++++++++++++++++++++++++++++++++ > pcs/utils.py | 31 +++++++++++++ > 5 files changed, 195 insertions(+), 7 deletions(-) > create mode 100644 pcs/test/test_utils.py > >diff --git a/pcs/resource.py b/pcs/resource.py >index c499e80..013f732 100644 >--- a/pcs/resource.py >+++ b/pcs/resource.py >@@ -1276,9 +1276,10 @@ def resource_master_remove(argv): > utils.replace_cib_configuration(dom) > > def resource_remove(resource_id, output = True): >- if utils.does_exist('//master[@id="'+resource_id+'"]'): >- master = parseString(utils.get_cib_xpath('//master[@id="'+resource_id+'"]')) >- resource_id = master.getElementsByTagName("primitive")[0].getAttribute("id") >+ dom = utils.get_cib_dom() >+ cloned_resource = utils.dom_get_clone_ms_resource(dom, resource_id) >+ if cloned_resource: >+ resource_id = cloned_resource.getAttribute("id") > > if utils.does_exist('//group[@id="'+resource_id+'"]'): > print "Removing group: " + resource_id + " (and all resources within group)" >@@ -1294,10 +1295,6 @@ def resource_remove(resource_id, output = True): > resource_remove(res.getAttribute("id")) > sys.exit(0) > >- if utils.does_exist('//clone[@id="'+resource_id+'"]'): >- clone = parseString(utils.get_cib_xpath('//clone[@id="'+resource_id+'"]')) >- resource_id = clone.getElementsByTagName("primitive")[0].getAttribute("id") >- > group = utils.get_cib_xpath('//group/primitive[@id="'+resource_id+'"]/..') > num_resources_in_group = 0 > master = utils.get_cib_xpath('//master/primitive[@id="'+resource_id+'"]/..') >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..a89ae13 100644 >--- a/pcs/test/test_resource.py >+++ b/pcs/test/test_resource.py >@@ -1704,6 +1704,55 @@ 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 delete dummies-clone") >+ ac(output, "Removing group: dummies (and all resources within group)\nStopping all resources in group: dummies...\nDeleting Resource - dummy1\nDeleting Resource - dummy2\nDeleting Resource (and group and clone) - dummy3\n") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show") >+ ac(output, "NO resources configured\n") >+ assert retVal == 0 >+ >+ 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 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 delete dummies-master") >+ ac(output, "Removing group: dummies (and all resources within group)\nStopping all resources in group: dummies...\nDeleting Resource - dummy1\nDeleting Resource - dummy2\nDeleting Resource (and group and M/S) - dummy3\n") >+ assert retVal == 0 >+ output, retVal = pcs(temp_cib, "resource show") >+ ac(output, "NO resources configured\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 1107612
: 909604 |
909605