- moved bwlimit stuff here
[nodemanager.git] / net.py
1 """network configuration"""
2
3 import sioc
4 import bwlimit
5 import logger
6
7 def GetSlivers(data):
8     # query running network interfaces
9     devs = sioc.gifconf()
10     ips = dict(zip(devs.values(), devs.keys()))
11     macs = {}
12     for dev in devs:
13         macs[sioc.gifhwaddr(dev).lower()] = dev
14
15     # XXX Exempt Internet2 destinations from node bwlimits
16     # bwlimit.exempt_init('Internet2', internet2_ips)
17
18     for d in data:
19         for network in d['networks']:
20             # Get interface name preferably from MAC address, falling
21             # back on IP address.
22             if macs.has_key(network['mac'].lower()):
23                 dev = macs[network['mac'].lower()]
24             elif ips.has_key(network['ip']):
25                 dev = ips[network['ip']]
26             else:
27                 logger.log('%s: no such interface with address %s/%s' % (self.name, network['ip'], network['mac']))
28                 continue
29
30             # Get current node cap
31             try:
32                 old_bwlimit = bwlimit.get_bwcap(dev)
33             except:
34                 old_bwlimit = None
35
36             # Get desired node cap
37             if network['bwlimit'] is None or network['bwlimit'] < 0:
38                 new_bwlimit = bwlimit.bwmax
39             else:
40                 new_bwlimit = network['bwlimit']
41
42             if old_bwlimit != new_bwlimit:
43                 # Reinitialize bandwidth limits
44                 bwlimit.init(dev, new_bwlimit)
45
46                 # XXX This should trigger an rspec refresh in case
47                 # some previously invalid sliver bwlimit is now valid
48                 # again, or vice-versa.
49
50 def start(options, config):
51     pass