fixes dependency on OrderedDict in netcfg

This removes the need for OrderedDict which will make the update
capable with Python version < 2.7

fixes ansible/ansible-modules-core#3979
pull/16483/head
Peter Sprygada 10 years ago
parent dd15a15edc
commit c80d8b97e8

@ -18,7 +18,6 @@
# #
import re import re
import collections
import itertools import itertools
import shlex import shlex
@ -109,10 +108,9 @@ class NetworkConfig(object):
return self._config return self._config
def __str__(self): def __str__(self):
config = collections.OrderedDict() if self._device_os == 'junos':
for item in self._config: return self.to_lines(self.expand(self.items))
self.expand(item, config) return self.to_block(self.expand(self.items))
return '\n'.join(self.flatten(config))
def load(self, contents): def load(self, contents):
self._config = parse(contents, indent=self.indent) self._config = parse(contents, indent=self.indent)
@ -154,26 +152,29 @@ class NetworkConfig(object):
regexp = r'%s' % regexp regexp = r'%s' % regexp
return re.findall(regexp, str(self)) return re.findall(regexp, str(self))
def expand(self, obj, items): def to_lines(self, section):
block = [item.raw for item in obj.parents] lines = list()
block.append(obj.raw) for entry in section[1:]:
line = ['set']
current_level = items line.extend([p.text for p in entry.parents])
for b in block: line.append(entry.text)
if b not in current_level: lines.append(' '.join(line))
current_level[b] = collections.OrderedDict() return lines
current_level = current_level[b]
for c in obj.children: def to_block(self, section):
if c.raw not in current_level: return '\n'.join([item.raw for item in section])
current_level[c.raw] = collections.OrderedDict()
def expand(self, objs):
def flatten(self, data, obj=None): visited = set()
if obj is None: expanded = list()
obj = list() for o in objs:
for k, v in data.items(): for p in o.parents:
obj.append(k) if p not in visited:
self.flatten(v, obj) visited.add(p)
return obj expanded.append(p)
expanded.append(o)
visited.add(o)
return expanded
def get_object(self, path): def get_object(self, path):
for item in self.items: for item in self.items:
@ -226,16 +227,12 @@ class NetworkConfig(object):
updates.extend(config) updates.extend(config)
break break
updates = self.expand(updates)
if self._device_os == 'junos': if self._device_os == 'junos':
return updates return updates
diffs = collections.OrderedDict() return [item.text for item in self.expand(updates)]
for update in updates:
if replace == 'block' and update.parents:
update = update.parents[-1]
self.expand(update, diffs)
return self.flatten(diffs)
def _build_children(self, children, parents=None, offset=0): def _build_children(self, children, parents=None, offset=0):
for item in children: for item in children:

Loading…
Cancel
Save