review imports in sliver_{libvirt,lxc}
[nodemanager.git] / plugins / drl.py
1 #!/usr/bin/python
2
3 """ DRL configurator.  """
4
5 import os
6 import shutil
7
8 import logger
9 import tools
10
11
12 drl = """<?xml version="1.0" encoding="UTF-8"?>
13 <!-- %s -->
14 <drl>
15     <machine id="%d" limit="%d" commfabric="MESH" accounting="STANDARD" ewma="0.1" htb_node="100" htb_parent="10">
16
17 %s
18     </machine>
19 </drl>"""
20
21 def start():
22     logger.log('drl plugin starting up...')
23
24
25 def DRLSetup(site_name, slice_name, site_id, bw_limit, peer):
26     DRL_file = '/vservers/%s/etc/drl.xml' % slice_name
27     DRL_config = drl % (site_name, site_id, bw_limit, peer)
28
29     # Check config changes
30     if os.path.exists(DRL_file):
31         import md5
32         new_digest = md5.new(DRL_config).digest()
33         old_digest = md5.new(open(DRL_file).read()).digest()
34         if old_digest == new_digest:
35             logger.log('drl: %s already exists...' % DRL_file)
36             DRLInstall(slice_name)
37             return
38     DRLConfig(DRL_file, DRL_config)
39     DRLInstall(slice_name)
40
41
42 def DRLConfig(DRL_file, DRL_config):
43     logger.log('drl: %s is out-dated...' % DRL_file)
44     logger.log('drl: generating %s' % DRL_file)
45     f = open( DRL_file, 'w')
46     f.write(DRL_config)
47     f.close()
48
49
50 def DRLInstall(slice_name):
51     if not os.path.exists('/vservers/%s/etc/yum.repos.d/myplc.repo' % slice_name):
52         shutil.copyfile('/etc/yum.myplc.d/myplc.repo', '/vservers/%s/etc/yum.repos.d/myplc.repo' % slice_name)
53         logger.log('drl: installing DistributedRateLimiting into %s slice' % slice_name)
54         logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'yum', 'install', '-y', '-q', 'DistributedRateLimiting'])
55         logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'chkconfig', '--add', 'ulogd'])
56     else:
57         logger.log('drl: updating DistributedRateLimiting on %s slice' % slice_name)
58         logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'yum', 'update', '-y', '-q', 'DistributedRateLimiting'])
59
60     logger.log('drl: (re)starting DistributedRateLimiting service')
61     logger.log_call(['vserver', '%s' % slice_name, 'suexec', '0', 'service', 'ulogd', 'restart'])
62
63
64 def GetSlivers(data, conf = None, plc = None):
65     DRL_SLICE_NAME = ''
66     HAVE_DRL = 0
67     node_id = tools.node_id()
68
69     if 'slivers' not in data:
70         logger.log_missing_data("drl.GetSlivers",'slivers')
71         return
72
73     for sliver in data['slivers']:
74         for attribute in sliver['attributes']:
75             tag = attribute['tagname']
76             value = attribute['value']
77             if tag == 'drl' and value == '1':
78                 HAVE_DRL = 1
79                 DRL_SLICE_NAME = sliver['name']
80
81     if HAVE_DRL:
82         site_id = plc.GetNodes({'node_id': int(node_id) }, ['site_id'])
83         site_id = site_id[0]['site_id']
84
85         q = plc.GetSites({'site_id': site_id, 'enabled': True, 'peer_site_id': None}, ['name', 'node_ids'])
86         for i in q:
87             if i['node_ids'] != [] and len(i['node_ids']) > 1:
88                 z = plc.GetInterfaces({'node_id': i['node_ids'], 'is_primary': True, '~bwlimit': None}, ['node_id', 'ip', 'bwlimit'])
89                 total_bwlimit = 0
90                 peer = ''
91                 node_has_bwlimit = 0
92                 for j in range(len(z)):
93                     total_bwlimit +=  z[j]['bwlimit']
94                     if z[j]['node_id'] != int(node_id):
95                         peer += '\t<peer>%s</peer>\n' % z[j]['ip']
96                     else:
97                         node_has_bwlimit = 1
98                 if node_has_bwlimit:
99                     DRLSetup(i['name'], DRL_SLICE_NAME, site_id, total_bwlimit/1000, peer)
100                 else:
101                     logger.log('drl: This node has no bwlimit')
102
103             else:
104                 logger.log('drl: This site has only %s node' % len(i['node_ids']))
105     else:
106         logger.log('drl: This node has no drl slice!...')