new omf-oriented plugins
[nodemanager.git] / plugins / omf_resctl.py
1 #
2 # $Id$
3 # $URL$
4 #
5 # NodeManager plugin - first step of handling omf_controlled slices
6
7 """
8 Overwrites the 'resctl' tag of slivers controlled by OMF so sm.py does the right thing
9 """
10
11 import subprocess
12
13 import tools
14 import logger
15
16 priority = 11
17
18 ### xxx this should not be version-dependent
19 service_name='omf-resctl-5.3'
20
21 def start(options, conf):
22     logger.log("omf_resctl: plugin starting up...")
23
24 def GetSlivers(data, conf = None, plc = None):
25     if 'accounts' not in data: 
26         logger.log_missing_data("omf_resctl.GetSlivers",'accounts')
27         return
28
29     try:
30         xmpp_server=data['xmpp']['server']
31     except:
32         # disabled feature - bailing out
33         # xxx might need to clean up more deeply..
34         return
35
36     for sliver in data['slivers']:
37         name=sliver['name']
38         for chunk in sliver['attributes']:
39             if chunk['tagname']=='omf_control':
40                 # filenames
41                 yaml="/vservers/%s/etc/omf-resctl/omf-resctl.yaml"%name
42                 template="%s.in"%yaml
43                 # read template and replace
44                 template=file(template).read()
45                 yaml_contents=template\
46                     .replace('@XMPP_SERVER@',xmpp_server)\
47                     .replace('@NODE_HRN@','default')\
48                     .replace('@SLICE_NAME@',name)
49                 changes=tools.replace_file_with_string(yaml,yaml_contents)
50                 if changes:
51                     sp=subprocess.Popen(['vserver',name,'exec','service',service_name,'restart'],
52                                         stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
53                     (output,retcod)=sp.communicate()
54                     logger.log("omf_resctl: %s: restarted resource controller (retcod=%r)"%(name,retcod))
55                     logger.log("omf_resctl: got output\n%s"%output)
56                 else:
57                     logger.log("omf_resctl: %s: omf_control'ed sliver has no change" % name)