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