File crm_deleteunmanaged.patch of Package pacemaker

# HG changeset patch
# User Dejan Muhamedagic <dejan@hello-penguin.com>
# Date 1313755383 -7200
# Node ID e8ea8fb95f310997995576ee831693b0d3b2736a
# Parent  0abb257259ed722abaa32a237c3c284c08ec0737
Medium: Shell: enable removal of unmanaged resources (bnc#696506)

diff --git a/shell/modules/cibconfig.py b/shell/modules/cibconfig.py
--- a/shell/modules/cibconfig.py
+++ b/shell/modules/cibconfig.py
@@ -2303,7 +2303,7 @@ class CibFactory(Singleton):
                 no_object_err(obj_id)
                 rc = False
                 continue
-            if is_rsc_running(obj_id):
+            if is_rsc_managed(obj_id) and is_rsc_running(obj_id):
                 common_err("resource %s is running, can't delete it" % obj_id)
                 rc = False
             else:
diff --git a/shell/modules/xmlutil.py b/shell/modules/xmlutil.py
--- a/shell/modules/xmlutil.py
+++ b/shell/modules/xmlutil.py
@@ -178,6 +178,34 @@ def shadowfile(name):
 def shadow2doc(name):
     return file2doc(shadowfile(name))
 
+def is_xs_boolean_true(bool):
+    return bool.lower() in ("true","1")
+def is_rsc_managed(id):
+    if not is_live_cib():
+        return False
+    rsc_node = rsc2node(id)
+    if not rsc_node:
+        return False
+    prop_node = get_properties_node(get_conf_elem(cibdump2doc("crm_config"), "crm_config"))
+    # maintenance-mode, if true, overrides all
+    attr = get_attr_value(prop_node, "maintenance-mode")
+    if attr and is_xs_boolean_true(attr):
+        return False
+    # then check the rsc is-managed meta attribute
+    rsc_meta_node = get_rsc_meta_node(rsc_node)
+    attr = get_attr_value(rsc_meta_node, "is-managed")
+    if attr:
+        return is_xs_boolean_true(attr)
+    # then rsc_defaults is-managed attribute
+    rsc_dflt_node = get_rscop_defaults_meta_node(get_conf_elem(cibdump2doc("rsc_defaults"), "rsc_defaults"))
+    attr = get_attr_value(rsc_dflt_node, "is-managed")
+    if attr:
+        return is_xs_boolean_true(attr)
+    # finally the is-managed-default property
+    attr = get_attr_value(prop_node, "is-managed-default")
+    if attr:
+        return is_xs_boolean_true(attr)
+    return True
 def is_rsc_running(id):
     if not is_live_cib():
         return False
@@ -691,12 +719,20 @@ def silly_constraint(c_node,rsc_id):
 def get_rsc_children_ids(node):
     return [x.getAttribute("id") \
         for x in node.childNodes if is_child_rsc(x)]
-def get_rscop_defaults_meta_node(node):
+def get_child_nvset_node(node, attr_set = "meta_attributes"):
+    if not node:
+        return None
     for c in node.childNodes:
-        if not is_element(c) or c.tagName != "meta_attributes":
+        if not is_element(c) or c.tagName != attr_set:
             continue
         return c
     return None
+def get_rscop_defaults_meta_node(node):
+    return get_child_nvset_node(node)
+def get_rsc_meta_node(node):
+    return get_child_nvset_node(node)
+def get_properties_node(node):
+    return get_child_nvset_node(node, attr_set = "cluster_property_set")
 
 def new_cib():
     doc = xml.dom.minidom.Document()
@@ -727,12 +763,19 @@ def new_cib_element(node,tagname,id_pfx)
     node.appendChild(newnode)
     return newnode
 def get_attr_in_set(node,attr):
+    if not node:
+        return None
     for c in node.childNodes:
         if not is_element(c):
             continue
         if c.tagName == "nvpair" and c.getAttribute("name") == attr:
             return c
     return None
+def get_attr_value(node,attr):
+    n = get_attr_in_set(node,attr)
+    if not n:
+        return None
+    return n.getAttribute("value")
 def set_attr(node,attr,value):
     '''
     Set an attribute in the attribute set.
openSUSE Build Service is sponsored by