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