Browse code

fixes bugs in network filter for parsing ip address (#28404)

also adds parse_cli and parse_cli_textfsm to changelog

Peter Sprygada authored on 2017/08/19 03:05:26
Showing 3 changed files
... ...
@@ -128,6 +128,10 @@ Ansible Changes By Release
128 128
 - profile_roles
129 129
 - stderr
130 130
 
131
+#### New Filters:
132
+- parse_cli
133
+- parse_cli_textfsm
134
+
131 135
 #### New Inventory Plugins:
132 136
 - advanced_host_list
133 137
 - constructed_groups
... ...
@@ -345,17 +345,22 @@ class Template:
345 345
         self.env = Environment()
346 346
         self.env.filters.update({'ternary': ternary})
347 347
 
348
-    def __call__(self, value, variables=None):
348
+    def __call__(self, value, variables=None, fail_on_undefined=True):
349 349
         variables = variables or {}
350 350
         if not self.contains_vars(value):
351 351
             return value
352 352
 
353
-        value = self.env.from_string(value).render(variables)
353
+        try:
354
+            value = self.env.from_string(value).render(variables)
355
+        except UndefinedError:
356
+            if not fail_on_undefined:
357
+                return None
358
+            raise
354 359
 
355 360
         if value:
356 361
             try:
357 362
                 return ast.literal_eval(value)
358
-            except ValueError:
363
+            except:
359 364
                 return str(value)
360 365
         else:
361 366
             return None
... ...
@@ -131,7 +131,13 @@ def parse_cli(output, tmpl):
131 131
                         else:
132 132
                             items.append(None)
133 133
 
134
-                    objects.append(dict([(k, template(v, {'item': items})) for k, v in iteritems(value)]))
134
+                    obj = {}
135
+                    for k, v in iteritems(value):
136
+                        try:
137
+                            obj[k] = template(v, {'item': items}, fail_on_undefined=False)
138
+                        except:
139
+                            obj[k] = None
140
+                    objects.append(obj)
135 141
 
136 142
                 elif isinstance(value, Mapping):
137 143
                     items = list()