def _process_node(self, node, handler, params): old_include_root = None if self._has_attribute(node, "source"): source = self._get_attribute(node, "source") source_rp = RecipePath(self._include_root, source) old_include_root = self._include_root self._include_root = source_rp.get_root() xmlstr = source_rp.to_str() dom_init = XmlDomTreeInit() try: dom = dom_init.parse_string(xmlstr, filename=source_rp.abs_path()) except IOError as err: msg = "Unable to resolve include: %s" % str(err) raise XmlProcessingError(msg, node) loaded_node = None try: loaded_node = dom.getElementsByTagName(node.nodeName)[0] except Exception: msg = ("No '%s' element present in included file '%s'." % (node.nodeName, source_rp.abs_path())) raise XmlProcessingError(msg, node) old_attrs = self._get_all_attributes(node) parent = node.parentNode parent.replaceChild(loaded_node, node) node = loaded_node # copy all of the original attributes to the sourced node for name, value in old_attrs.iteritems(): # do not overwrite sourced attributes if not node.hasAttribute(name): node.setAttribute(name, value) parent = super(LnstParser, self) parent._process_node(node, handler, params) if old_include_root: self._include_root = old_include_root
class RecipeParse(LnstParser): def __init__(self, recipe_filepath): super(RecipeParse, self).__init__() self._filepath = recipe_filepath self._rp = RecipePath(None, self._filepath) self._include_root = self._rp.get_root() def first_pass(self): dom_init = XmlDomTreeInit() rp = self._rp self._xml_dom = dom_init.parse_string(rp.to_str(), rp.abs_path()) first_pass = FirstPass(self) first_pass.parse(self._xml_dom) def parse_recipe(self): self.first_pass() self._trigger_event("provisioning_requirements_ready", {}) second_pass = SecondPass(self) second_pass.parse(self._xml_dom)