def update_node_instance_attrs(cib, node_name, attrs, state_nodes=None): """ Update nvpairs in instance_attributes for a node specified by its name. Automatically creates instance_attributes element if needed. If the node has more than one instance_attributes element, the first one is modified. If the node is missing in the CIB, it is automatically created if its state is provided in state_nodes. etree cib -- cib string node_name -- name of the node to be updated dict attrs -- attrs to update, e.g. {'A': 'a', 'B': ''} iterable state_nodes -- optional list of node state objects """ node_el = _ensure_node_exists(get_nodes(cib), node_name, state_nodes) # If no instance_attributes id is specified, crm_attribute modifies the # first one found. So we just mimic this behavior here. attrs_el = node_el.find("./instance_attributes") if attrs_el is None: attrs_el = etree.SubElement( node_el, "instance_attributes", id=find_unique_id(cib, "nodes-{0}".format(node_el.get("id"))) ) update_nvset(attrs_el, attrs)
def test_raise_if_missing(self): for section in self.cib.tree.findall(".//configuration/nodes"): section.getparent().remove(section) assert_raise_library_error( lambda: lib.get_nodes(self.cib.tree), (severities.ERROR, report_codes.CIB_CANNOT_FIND_MANDATORY_SECTION, { "section": "configuration/nodes", }, None), )
def test_raise_if_missing(self): for section in self.cib.tree.findall(".//configuration/nodes"): section.getparent().remove(section) assert_raise_library_error( lambda: lib.get_nodes(self.cib.tree), ( severities.ERROR, report_codes.CIB_CANNOT_FIND_MANDATORY_SECTION, { "section": "configuration/nodes", }, None ), )
def update_node_instance_attrs(cib, id_provider, node_name, attrs, state_nodes=None): """ Update nvpairs in instance_attributes for a node specified by its name. Automatically creates instance_attributes element if needed. If the node has more than one instance_attributes element, the first one is modified. If the node is missing in the CIB, it is automatically created if its state is provided in state_nodes. etree cib -- cib IdProvider id_provider -- elements' ids generator string node_name -- name of the node to be updated dict attrs -- attrs to update, e.g. {'A': 'a', 'B': ''} iterable state_nodes -- optional list of node state objects """ # Do not ever remove the nvset element or the node element, even if they # are empty. There may be ACLs set in pacemaker which allow "write" for # nvpairs (adding, changing and removing) but not nvsets. In such a case, # removing the nvset would cause the whole change to be rejected by # pacemaker with a "permission denied" message. # https://bugzilla.redhat.com/show_bug.cgi?id=1642514 if not attrs: return cib_nodes = get_nodes(cib) node_el = _ensure_node_exists(cib_nodes, node_name, state_nodes) # If no instance_attributes id is specified, crm_attribute modifies the # first one found. So we just mimic this behavior here. attrs_el = node_el.find("./instance_attributes") if attrs_el is None: attrs_el = etree.Element( "instance_attributes", id=id_provider.allocate_id("nodes-{0}".format(node_el.get("id"))), ) update_nvset(attrs_el, attrs, id_provider) append_when_useful(node_el, attrs_el) append_when_useful(cib_nodes, node_el)
def update_node_instance_attrs( cib, id_provider, node_name, attrs, state_nodes=None ): """ Update nvpairs in instance_attributes for a node specified by its name. Automatically creates instance_attributes element if needed. If the node has more than one instance_attributes element, the first one is modified. If the node is missing in the CIB, it is automatically created if its state is provided in state_nodes. etree cib -- cib IdProvider id_provider -- elements' ids generator string node_name -- name of the node to be updated dict attrs -- attrs to update, e.g. {'A': 'a', 'B': ''} iterable state_nodes -- optional list of node state objects """ # Do not ever remove the nvset element or the node element, even if they # are empty. There may be ACLs set in pacemaker which allow "write" for # nvpairs (adding, changing and removing) but not nvsets. In such a case, # removing the nvset would cause the whole change to be rejected by # pacemaker with a "permission denied" message. # https://bugzilla.redhat.com/show_bug.cgi?id=1642514 if not attrs: return cib_nodes = get_nodes(cib) node_el = _ensure_node_exists(cib_nodes, node_name, state_nodes) # If no instance_attributes id is specified, crm_attribute modifies the # first one found. So we just mimic this behavior here. attrs_el = node_el.find("./instance_attributes") if attrs_el is None: attrs_el = etree.Element( "instance_attributes", id=id_provider.allocate_id("nodes-{0}".format(node_el.get("id"))), ) update_nvset(attrs_el, attrs, id_provider) append_when_useful(node_el, attrs_el) append_when_useful(cib_nodes, node_el)
def test_success_if_exists(self): self.assertEqual("nodes", lib.get_nodes(self.cib.tree).tag)
def test_success_if_exists(self): self.assertEqual( "nodes", lib.get_nodes(self.cib.tree).tag )
def get_node_names(cib: _Element) -> Set[str]: return { str(node.attrib["uname"]) for node in get_nodes(get_root(cib)).iterfind("./node") }