Hi,
I submit a patch for
"bugzilla 2541: Shell should warn if parameter uniqueness is violated"
for discussion.

devel1:~ # crm configure
crm(live)configure# primitive ip1a ocf:heartbeat:IPaddr2 params ip="1.2.3.4" 
meta target-role="stopped"
crm(live)configure# primitive ip1b ocf:heartbeat:IPaddr2 params ip="1.2.3.4" 
meta target-role="stopped"
crm(live)configure# primitive ip2a ocf:heartbeat:IPaddr2 params ip="1.2.3.5" 
meta target-role="stopped"
crm(live)configure# primitive ip2b ocf:heartbeat:IPaddr2 params ip="1.2.3.5" 
meta target-role="stopped"
crm(live)configure# primitive ip3 ocf:heartbeat:IPaddr2 params ip="1.2.3.6" 
meta target-role="stopped"
crm(live)configure# primitive dummy_1 ocf:heartbeat:Dummy params fake="abc" 
meta target-role="stopped"
crm(live)configure# primitive dummy_2 ocf:heartbeat:Dummy params fake="abc" 
meta target-role="stopped"
crm(live)configure# primitive dummy_3 ocf:heartbeat:Dummy meta 
target-role="stopped"
crm(live)configure# commit
WARNING: Violations of instance parameters with attribute unique detected:
  Agent "ocf:heartbeat:IPaddr2" parameter "ip" value "1.2.3.4" in resources
          ip1a
          ip1b

  Agent "ocf:heartbeat:IPaddr2" parameter "ip" value "1.2.3.5" in resources
          ip2a
          ip2b

Do you still want to commit? n
crm(live)configure#

The code now lives in ui.py. I'm not sure whether it should be considered as 
more cib related an be moved to some other module.

Regards
Holger

diff -r cf4e9febed8e -r 810c5ea83873 shell/modules/ui.py.in
--- a/shell/modules/ui.py.in	Wed Feb 23 14:52:34 2011 +0100
+++ b/shell/modules/ui.py.in	Thu Mar 03 10:24:51 2011 +0100
@@ -1509,6 +1509,60 @@
             return False
         set_obj = mkset_obj("xml")
         return ptestlike(set_obj.ptest,'vv',cmd,*args)
+
+    def __check_unique_clash(self):
+        'Check whether resource parameters with attribute "unique" clash'
+
+        def process_primitive(prim, clash_dict):
+            '''
+            Update dict clash_dict with
+            (ra_class, ra_provider, ra_type, name, value) -> [ resourcename ]
+            if parameter "name" should be unique
+            '''
+            ra_class = prim.getAttribute("class")
+            ra_provider = prim.getAttribute("provider")
+            ra_type = prim.getAttribute("type")
+            ra_id = prim.getAttribute("id")
+
+            ra = RAInfo(ra_class, ra_type, ra_provider)
+            if ra == None:
+                return
+            ra_params = ra.params()
+
+            attributes = prim.getElementsByTagName("instance_attributes")
+            if len(attributes) == 0:
+                return
+
+            for p in attributes[0].getElementsByTagName("nvpair"):
+                name = p.getAttribute("name")
+                if ra_params[ name ]['unique'] == '1':
+                    value = p.getAttribute("value")
+                    k = (ra_class, ra_provider, ra_type, name, value)
+                    try:
+                        clash_dict[k].append(ra_id)
+                    except:
+                        clash_dict[k] = [ra_id]
+            return
+
+        clash_dict = {}
+        for p in cib_factory.mkobj_list("xml","type:primitive"):
+            process_primitive(p.node, clash_dict)
+
+        clash_msg = []
+        for param, resources in clash_dict.items():
+            if len(resources) > 1:
+                tag = ':'.join(param[:3])
+                clash_msg.append('  Agent "%s" parameter "%s" value "%s" in resources'\
+                        %(tag, param[3], param[4]))
+                for r in sorted(resources):
+                    clash_msg.append("          %s"%r)
+                clash_msg.append("")
+
+        if len(clash_msg) > 0:
+            common_warning("Violations of instance parameters with attribute unique detected:")
+            print "\n".join(clash_msg)
+            return 0
+        return 1
     def commit(self,cmd,force = None):
         "usage: commit [force]"
         if force and force != "force":
@@ -1523,7 +1577,8 @@
         rc1 = cib_factory.is_current_cib_equal()
         rc2 = cib_factory.is_cib_empty() or \
             self._verify(mkset_obj("xml","changed"),mkset_obj("xml"))
-        if rc1 and rc2:
+        rc3 = self.__check_unique_clash()
+        if rc1 and rc2 and rc3:
             return cib_factory.commit()
         if force or user_prefs.get_force():
             common_info("commit forced")
_______________________________________________
Pacemaker mailing list: Pacemaker@oss.clusterlabs.org
http://oss.clusterlabs.org/mailman/listinfo/pacemaker

Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://developerbugs.linux-foundation.org/enter_bug.cgi?product=Pacemaker

Reply via email to