You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.5 KiB
Python

#!/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}}