commit 032cc40be7902533ce62d8bfc514339f5138c7e7 Author: Radek Pazdera rpazdera@redhat.com Date: Fri Mar 8 10:14:37 2013 +0100
XmlTemplates: Accessing $recipe no longer allowed
This commit removes the support for accessing the recipe dictionary using the $recipe template variable.
These are implementation details and we should not allow users to access them directly.
Additionally, we will do a major refactoring of the NetTestController class in the near future and this variable might even no longer exist after that.
Signed-off-by: Radek Pazdera rpazdera@redhat.com
lnst/Common/XmlProcessing.py | 1 + lnst/Common/XmlTemplates.py | 52 +++++++++++++--------------------- lnst/Controller/NetTestController.py | 13 ++++---- lnst/Controller/NetTestParse.py | 5 --- 4 files changed, 28 insertions(+), 43 deletions(-) --- diff --git a/lnst/Common/XmlProcessing.py b/lnst/Common/XmlProcessing.py index 839495d..80e9aca 100644 --- a/lnst/Common/XmlProcessing.py +++ b/lnst/Common/XmlProcessing.py @@ -237,6 +237,7 @@ class RecipeParser(XmlParser):
def set_recipe(self, recipe): self._recipe = recipe + self._template_proc.set_machines(recipe["machines"])
def set_definitions(self, defs): self._template_proc.set_definitions(defs) diff --git a/lnst/Common/XmlTemplates.py b/lnst/Common/XmlTemplates.py index 8f0d6e3..218031d 100644 --- a/lnst/Common/XmlTemplates.py +++ b/lnst/Common/XmlTemplates.py @@ -29,7 +29,7 @@ class XmlTemplateError(Exception): class XmlTemplates: """ This class serves as template processor """
- _alias_re = "{$([a-zA-Z0-9_]+)([[^{}]+])?}" + _alias_re = "{$([a-zA-Z0-9_]+)}" _func_re = "{([a-zA-Z0-9_]+)(([^()]*))}"
def __init__(self, definitions=None): @@ -38,7 +38,8 @@ class XmlTemplates: else: self._definitions = [{}]
- self._reserved_aliases = ["recipe"] + self._machines = {} + self._reserved_aliases = []
def set_definitions(self, defs): """ Set alias definitions @@ -63,6 +64,14 @@ class XmlTemplates:
return defs
+ def set_machines(self, machines): + """ Assign machine information + + XmlTemplates use these information about the machines + to resolve template functions within the recipe. + """ + self._machines = machines + def define_alias(self, name, value, skip_reserved_check=False): """ Associate an alias name with some value
@@ -163,20 +172,8 @@ class XmlTemplates: alias_match = re.match(self._alias_re, string) if alias_match: alias_name = alias_match.group(1) - array_subscript = alias_match.group(2) - alias_obj = self._find_definition(alias_name)
- if array_subscript != None: - try: - result = str(eval("alias_obj%s" % array_subscript)) - except (KeyError, IndexError): - err = "Wrong array subscript in '%s%s'" \ - % (alias_name, array_subscript) - raise XmlTemplateError(err) - else: - result = alias_obj - return result
def _process_func_template(self, string): @@ -217,17 +214,17 @@ class XmlTemplates:
def _ip_func(self, params): self._validate_func_params("ip", params, 2, 1) - recipe = self._get_recipe_data("ip") + machines = self._machines
m_id = params[0] if_id = params[1] ip_id = int(params[2]) if len(params) == 3 else 0
- if 'machines' not in recipe or m_id not in recipe['machines']: + if m_id not in machines: msg = "First parameter of function ip() is invalid: "\ "Machine %s does not exist." % m_id raise XmlTemplateError(msg) - machine = recipe["machines"][m_id] + machine = machines[m_id]
if if_id not in machine['netconfig']: @@ -245,15 +242,15 @@ class XmlTemplates:
def _hwaddr_func(self, params): self._validate_func_params("hwaddr", params, 2, 0) - recipe = self._get_recipe_data("hwaddr") + machines = self._machines m_id = params[0] if_id = params[1]
- if 'machines' not in recipe or m_id not in recipe['machines']: + if m_id not in machines: msg = "First parameter of function hwaddr() is invalid: "\ "Machine %s does not exist." % m_id raise XmlTemplateError(msg) - machine = recipe["machines"][m_id] + machine = machines[m_id]
if if_id not in machine['netconfig']: msg = "Second parameter of function hwaddr() is invalid: "\ @@ -266,15 +263,15 @@ class XmlTemplates:
def _devname_func(self, params): self._validate_func_params("devname", params, 2, 0) - recipe = self._get_recipe_data("devname") + machines = self._machines m_id = params[0] if_id = params[1]
- if 'machines' not in recipe or m_id not in recipe['machines']: + if m_id not in machines: msg = "First parameter of function devname() is invalid: "\ "Machine %s does not exist." % m_id raise XmlTemplateError(msg) - machine = recipe["machines"][m_id] + machine = machine[m_id]
if if_id not in machine['netconfig']: msg = "Second parameter of function devname() is invalid: "\ @@ -301,12 +298,3 @@ class XmlTemplates: except ValueError: err = "Non-integer parameter passed to '%s'" % name raise XmlTemplateError(err) - - def _get_recipe_data(self, template_name): - try: - recipe = self._find_definition("recipe") - return recipe - except XmlTemplateError as err: - msg = "Cannot resolve %s(): " % template_name - msg += str(err) - raise XmlTemplateError(msg) diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py index d686475..80a132d 100644 --- a/lnst/Controller/NetTestController.py +++ b/lnst/Controller/NetTestController.py @@ -51,10 +51,11 @@ class NetTestController: check_process_running("libvirtd")) self._slave_pool = sp
- self._recipe = {} - definitions = {"recipe": self._recipe} - - self._recipe["networks"] = {} + self._recipe = recipe = {} + recipe["networks"] = {} + recipe["machines"] = {} + recipe["provisioning"] = {} + recipe["switches"] = {}
mac_pool_range = config.get_option('environment', 'mac_pool_range') self._mac_pool = MacPool(mac_pool_range[0], @@ -62,7 +63,6 @@ class NetTestController:
ntparse = NetTestParse(recipe_path) ntparse.set_recipe(self._recipe) - ntparse.set_definitions(definitions)
ntparse.register_event_handler("provisioning_requirements_ready", self._prepare_provisioning) @@ -115,7 +115,8 @@ class NetTestController: msg = "This setup cannot be provisioned with the current pool." raise NetTestError(msg)
- self._recipe["machines"] = machines + for m_id, machine in machines.iteritems(): + self._recipe["machines"][m_id] = machine provisioning["map"] = {}
logging.info("Provisioning initialized") diff --git a/lnst/Controller/NetTestParse.py b/lnst/Controller/NetTestParse.py index 39d23bd..257fe77 100644 --- a/lnst/Controller/NetTestParse.py +++ b/lnst/Controller/NetTestParse.py @@ -28,9 +28,6 @@ class NetTestParse(RecipeParser): self._rp = RecipePath(None, self._filepath) self._include_root = self._rp.get_root()
- self._recipe = {} - self._template_proc.set_definitions({"recipe": self._recipe}) - def parse_recipe(self): dom_init = XmlDomTreeInit() rp = self._rp @@ -58,7 +55,6 @@ class FirstPass(RecipeParser): """
def parse(self, node): - self._recipe["provisioning"] = {} self._recipe["provisioning"]["setup_requirements"] = {}
if node.nodeType == node.DOCUMENT_NODE: @@ -132,7 +128,6 @@ class SecondPass(RecipeParser): subparser.parse(node)
def _switches(self, node, params): - self._recipe["switches"] = {} scheme = {"switch": self._switch} self._process_child_nodes(node, scheme)
lnst-developers@lists.fedorahosted.org