def find_node_list(tree): """ Return list of remote nodes from the specified element tree etree.Element tree -- an element to search remote nodes in """ node_list = [ PacemakerNode( nvpair.getparent().getparent().attrib["id"], nvpair.attrib["value"] ) for nvpair in tree.xpath( ".//primitive[{is_remote}]/{has_server}" .format( is_remote=_IS_REMOTE_AGENT_XPATH_SNIPPET, has_server=_HAS_SERVER_XPATH_SNIPPET, ) ) ] node_list.extend([ PacemakerNode(primitive.attrib["id"], primitive.attrib["id"]) for primitive in tree.xpath( ".//primitive[{is_remote} and not({has_server})]" .format( is_remote=_IS_REMOTE_AGENT_XPATH_SNIPPET, has_server=_HAS_SERVER_XPATH_SNIPPET, ) ) ]) return node_list
def test_find_multiple_nodes(self): self.assert_nodes_equals( """ <resources> <primitive class="ocf" id="R1" provider="pacemaker" type="remote" > <instance_attributes> <nvpair name="server" value="H1"/> </instance_attributes> </primitive> <primitive class="ocf" id="R2" provider="pacemaker" type="remote" > <instance_attributes id="first-attribs"> <nvpair name="server" value="H2"/> </instance_attributes> </primitive> </resources> """, [ PacemakerNode("R1", "H1"), PacemakerNode("R2", "H2"), ], )
def find_node_list(tree): """ Return list of guest nodes from the specified element tree etree.Element tree -- an element to search guest nodes in """ node_list = [] for meta_attrs in tree.xpath(""" .//primitive /meta_attributes[ nvpair[ @name="remote-node" and string-length(@value) > 0 ] ] """): host = None name = None for nvpair in meta_attrs: if nvpair.attrib.get("name", "") == "remote-addr": host = nvpair.attrib["value"] if nvpair.attrib.get("name", "") == "remote-node": name = nvpair.attrib["value"] if host is None: host = name if name: # The name is never empty as we only loop through elements with # non-empty names. It's just we loop through nvpairs instead of # reading the name directly. node_list.append(PacemakerNode(name, host)) return node_list
def test_get_multiple_nodes(self): self.assert_nodes_equals( """ <resources> <primitive> <meta_attributes> <nvpair name="remote-node" value="G1"/> <nvpair name="remote-addr" value="G1addr"/> </meta_attributes> </primitive> <primitive> <meta_attributes> <nvpair name="remote-node" value="G2"/> </meta_attributes> </primitive> </resources> """, [PacemakerNode("G1", "G1addr"), PacemakerNode("G2", "G2"),], )
def test_find_nodes_without_server(self): self.assert_nodes_equals( """ <resources> <primitive class="ocf" id="R1" provider="pacemaker" type="remote" > </primitive> </resources> """, [ PacemakerNode("R1", "R1"), ])
def test_find_nodes_with_empty_server(self): #it does not work, but the node "R1" is visible as remote node in the #status self.assert_nodes_equals( """ <resources> <primitive class="ocf" id="R1" provider="pacemaker" type="remote" > <instance_attributes id="first-attribs"> <nvpair name="server" value=""/> </instance_attributes> </primitive> </resources> """, [ PacemakerNode("R1", "R1"), ])