Record list filters

Note

New in verision 0.5.11

Filtering examples:

# 1. get all the routes
# 2. join with interfaces on route.oif == interface.index
# 3. select only fields dst, gateway, ifname and mac address
# 4. transform the mac address into xxxx.xxxx.xxxx notation
# 5. dump the info in the CSV format

(ndb
 .routes
 .dump()
 .join(ndb.interfaces.dump(),
       condition=lambda l, r: l.oif == r.index)
 .select('dst', 'gateway', 'oif', 'ifname', 'address')
 .transform(address=lambda x: '%s%s.%s%s.%s%s' % tuple(x.split(':')))
 .format('csv'))

'dst','gateway','oif','ifname','address'
'172.16.20.0','127.0.0.2',1,'lo','0000.0000.0000'
'172.16.22.0','127.0.0.4',1,'lo','0000.0000.0000'
'','172.16.254.3',3,'wlp58s0','60f2.6289.400e'
'10.250.3.0',,39,'lxcbr0','0016.3e00.0000'
'10.255.145.0','10.255.152.254',42881,'prdc51e6d5','4a6a.60b1.8448'
...
class pyroute2.ndb.report.RecordSet(generator, ellipsis=True)

NDB views return objects of this class with summary() and dump() methods. RecordSet objects are generator-based, they do not store the data in the memory, but transform them on the fly.

RecordSet filters also return objects of this class, thus making possible to make chains of filters.

transform(**kwarg)

Transform record fields with a provided functions:

view.transform(field_name_1=func1,
               field_name_2=func2)

Examples, transform MAC addresses into dots-format and IEEE 802:

fmt = '%s%s.%s%s.%s%s'
(ndb
 .interfaces
 .summary()
 .transform(address=lambda x: fmt % tuple(x.split(':')))

(ndb
 .interfaces
 .summary()
 .transform(address=lambda x: x.replace(':', '-').upper()))
filter(f=None, **kwarg)

Filter records. This function may be called in two ways. One way is a simple match. Select ports of br0 only in the up state:

(ndb
 .interfaces
 .dump()
 .filter(master=ndb.interfaces['br0']['index'],
         state='up'))

When a simple match is not a solution, one can provide a matching function. Select only MPLS lwtunnel routes:

(ndb
 .routes
 .dump()
 .filter(lambda x: x.encap_type == 1 and x.encap is not None))
select(*argv)

Select fields from records:

ndb.interfaces.dump().select('index', 'ifname', 'state')
join(right, condition=<function RecordSet.<lambda>>, prefix='')

Join two reports.

  • right – a report to join with

  • condition – filter records with a function

  • prefix – rename the “right” fields using the prefix

The condition function must have two arguments, left record and right record, and must return True or False. The routine discards joined records when the condition is False.

Example, provide interface names for routes, don’t change field names:

(ndb
 .routes
 .dump()
 .join(ndb.interfaces.dump(),
       condition=lambda l, r: l.oif == r.index)
 .select('dst', 'gateway', 'ifname'))

Warning: this method loads the whole data of the right report into the memory.

format(kind)

Convert report records into other formats. Supported formats are ‘json’ and ‘csv’.

The resulting report can not use filters, transformations etc. Thus, the format() call should be the last in the chain:

(ndb
 .addresses
 .summary()
 .format('csv'))
count()

Return number of records.

This method is destructive, as it exhausts the generator.