#!/usr/bin/env python import xml.etree.ElementTree as ET from mininet.topo import Topo from mininet.link import TCLink class GraphmlTopo(Topo): def build(self, filename='topology.graphml'): positions = dict() try: graph = ET.parse(filename).getroot() except Exception as error: print('oops: ', error) exit(1) for node in graph.iter('{http://graphml.graphdrawing.org/xmlns}node'): node_id = int(node.get('id')) + 1 privateDirs = ['/var/log','/var/run'] self.addHost('h%i' % node_id, privateDirs=privateDirs) x_pos = node.find('.//data[@key="x"]') y_pos = node.find('.//data[@key="y"]') positions[node_id] = (x_pos, y_pos) for link in graph.iter('{http://graphml.graphdrawing.org/xmlns}edge'): link_id = int(link.get('id')) + 1 source = int(link.get('source')) + 1 target = int(link.get('target')) + 1 linkopts = self.format_intf_params(source, target, link_id) # dict(bw=10, delay='5ms', loss=20, max_queue_size=1000, use_htb=True) # linkopts.update(self.) # to implement a function which from nodes positions return linkopts self.addLink('h%i' % source, 'h%i' % target, cls=TCLink, **linkopts) def format_intf_params(self, source_id, target_id, link_id): return dict() class GraphmlTopoUniqueSubnet(GraphmlTopo): def format_intf_params(self, source_id, target_id, link_id): intf_name_s = 'h%i-eth%i' % (source_id, link_id) intf_name_t = 'h%i-eth%i' % (target_id, link_id) addr_s = '00:00:00:00:%02i:%02i' % (source_id, link_id) addr_t = '00:00:00:00:%02i:%02i' % (target_id, link_id) ip_s = '10.0.%i.%i/16' % (source_id, link_id) ip_t = '10.0.%i.%i/16' % (target_id, link_id) return {'addr1' : addr_s, 'params1' : {'ip': ip_s}, 'addr2' : addr_t, 'params2' : {'ip': ip_t}} class GraphmlTopoDifferentSubnet(GraphmlTopo): def format_intf_params(self, source_id, target_id, link_id): addr_s = '00:00:00:00:%02i:%02i' % (source_id, link_id) addr_t = '00:00:00:00:%02i:%02i' % (target_id, link_id) ip_s = '10.0.%i.%i/24' % (link_id, source_id) ip_t = '10.0.%i.%i/24' % (link_id, target_id) return {'addr1' : addr_s, 'params1' : {'ip': ip_s}, 'addr2' : addr_t, 'params2' : {'ip': ip_t}}